# Sinespace Documentation > Documentation for Sinespace β€” build, customize, and run virtual worlds. ## Curator Dashboard ### Curator Dashboard #### [πŸ“„οΈOverview](/curator-dashboard/overview.md) [Overview \*\*Curator Dashboard\*\* lets you manage all your contents uploaded to Sinespace.](/curator-dashboard/overview.md) --- ### Adding Textures to an Item #### Overview[​](#overview "Direct link to Overview") You will need to bring your texture image into the project window by dragging and dropping it in from where you have it saved. You will need to bring your texture image into the project window by dragging and dropping it in from where you have it saved. #### Changing Your Texture Settings[​](#changing-your-texture-settings "Direct link to Changing Your Texture Settings") Once you have the texture image in the project window, you will need to change it’s properties. Click on the texture image, and it’s Import Settings will come up on the right hand side: ![Fabimport.jpg](/assets/images/fabimport-08d27ce1059a28282f611f02883f582c.jpg) For my t-shirt, I am going to change the texture image from Sprite to Texture under the Texture Type subheader. I am also changing the Wrap type to Repeat so the texture is seamless all the way around the t-shirt. If you are adding normal maps to your item, you can change the normal map image to a normal map texture the same way, just choose Normal Map under the texture type. **Tiling** Under the texture settings, you will find Tiling. This will adjust the size of the texture on your item. You can set these to whatever suits you. **Offset** This will offset the texture to the left or to the right of the centre of your item. ![Tilingoffset.jpg](/assets/images/tilingoffset-88d3e1e0742abdeb27109a263c77553b.jpg) #### Applying the Texture to your Item[​](#applying-the-texture-to-your-item "Direct link to Applying the Texture to your Item") Apply the texture setting you want and click on your main material. Drag and drop the texture image into the box next to Albedo. Now it should show the main colour you picked for the item, and the texture in the box. ![Albedobox.jpg](/assets/images/albedobox-87e9df6604fcb2cc227c082b28103690.jpg) Now you can see your texture on the item in the scene and make changes to the above settings to suit you. --- ### Build A Business #### Overview[​](#overview "Direct link to Overview") Quality control We offer quality control by reviewing all content being uploaded to Sinespace. ##### Quality control[​](#quality-control "Direct link to Quality control")
We offer quality control by reviewing all content being uploaded to Sinespace. * [Content Processing](/policies/content-processing.md) * [Content Protection](/policies/content-protection.md) ##### Certified creators program[​](#certified-creators-program "Direct link to Certified creators program")
Our Certified Creators program means you can instantly get your items sent to live instead of going through the review progress. * [Certified Creators Program](/policies/certified-creators-program.md) ##### Merchant tools[​](#merchant-tools "Direct link to Merchant tools")
With access to merchant tools like item vendors, cashouts and white label grids, you can make your brand and business a virtual success. * [Virtual Goods Component](/sinespace-sdk/components/virtual-goods.md) * [Modular Vendors](/sinespace-sdk/components/modular-vendors.md) * [Avatars](/sinespace-sdk/avatars/clothing.md) * [Regions](/sinespace-viewer/regions/regions-in-sinespace.md) If you need any guidance on how to upload your creations to Sinespace or want to chat with other creators, check out our [Discord Channel!](https://discord.gg/sinespace) --- ### Buy Currency #### Overview[​](#overview "Direct link to Overview") Gold and Silver Gold Gold credits can be purchased for real money. #### Gold and Silver[​](#gold-and-silver "Direct link to Gold and Silver") ###### Gold[​](#gold "Direct link to Gold") Gold credits can be purchased for real money. Purchased gold can not be converted back to real world currency. Gold used to purchase items allows "verified" creators to sell their virtual goods and convert back to their local currency. Gold credits trade at 10 / 1 (100 gold = $1.00) fixed ratio with USD$ To buy gold, click on the shop tab on the bottom of the interface. Upper right of the shop window click on buy gold. Choose option. You can buy gold with Paypal, all major credit cards right now. Please contact Sinespace staff if you find your payment method is not supported. ###### Silver[​](#silver "Direct link to Silver") Silver credits are free promotional credits you can earn by participating in the community and completing quests and achievements. Silver credits cannot be converted to real money but can be used to buy virtual goods offered by creators with a silver price. It is up to individual creators to decide which of their virtual goods they want to offer for silver and which for gold. You cannot convert silver into gold. --- ### Items #### Overview[​](#overview "Direct link to Overview") Items in Sinespace are any type of virtual good a creator has uploaded to Sinespace; this includes clothing, regions, vehicles, animations, room templates and furniture. Items in Sinespace are any type of virtual good a creator has uploaded to Sinespace; this includes clothing, regions, vehicles, animations, room templates and furniture. Under the Items tab on the Curator Dashboard, you will see a list of all your items which are being/have been uploaded to Sinespace. You can use the search bar at the top to quickly find an item using the items' name, the brand, status or ID. You can also edit an items' information, send it to review or delete it from here. danger If you delete an item it will be permanently deleted. If you need to remove an item from the shop, please mark it as No Gold and No Silver under the Edit option. Users who purchased the item will still have it in their Inventory after deletion from Curator. ![Items tab overview](/assets/images/itemslist-5e4709ab4db17812da64fb9d88b655d5.png) --- ### Common Uploading Issues #### Overview[​](#overview "Direct link to Overview") When creating content for Sinespace, you may find that you run into a few common issues when uploading your items. When creating content for Sinespace, you may find that you run into a few common issues when uploading your items. Please check below to see what you can do to solve these common problems. **1. My Item has been rejected** If you have sent in your item for review, and it has been rejected, we will make sure to add a note to the item on curator.sine.space, stating why it has been rejected. If you do not see a note on curator.sine.space, then please do contact us by sending us a support ticket, and we will give you an answer on why it has been rejected. **2. My item isn’t showing in the Shop** If your item isn’t showing up in world, please make sure that you have added the item to an existing category in the Shop. For example, if you have made a region template, please make sure that the region is under one of the region categories. If you want a category added, please contact us via a support ticket or in world, and we will do our best to get this category added. Another reason for it not showing up in the Shop might be because you have ticked β€˜Not for Sale’ in the Virtual Good component which will make a private item. **3. I want my item to only be sold for Gold, but it’s for sale with Silver as well, how can I make it so it’s sold for only Gold?** If you have uploaded an item you want sold for only Gold and no Silver, please set the Item Price in the Virtual Good component as -1 for Silver and add the amount you want the item sold for in Gold. **4. My item is in the wrong category** If your item has been placed in the wrong category, please make sure in the Virtual Good component that the category is set to the right one. Please bear in mind that if you want an item to be spawnable, you need to set its type to Generic. **5. My item hasn’t uploaded, why is that?** There might be a couple of reasons why your item isn’t uploading. One could be that the item is a duplicate of another item, and you haven’t changed the name or description in the Virtual Good component. Another reason for the item not being uploaded might be because it has gotten stuck in a processing queue. You can check the status of your item on curator.sine.space. And lastly, an item might not be uploaded if you have forgotten to clear the original ID on a duplicate item. '''6. I have uploaded an updated version of my item, why can't I see it in my inventory?''' If you have uploaded an updated version of your item, and you can't see it in your inventory, make sure to click the Refresh button in your inventory. ![Invenrefresh.png](/assets/images/invenrefresh-23767dfc3755e14bda86051f9d914efc.png) You should see your item after refreshing. It may look the same as before in the inventory if you have kept the same icon, but the item should have your changes, so make sure to test it! '''7. My furniture item isn't showing in the Edit Room inventory, why is that?''' For furniture to show up in the Edit Room inventory, you need to make sure that in the Editor pack, you have set the item to Furniture and added the Room Furniture component to it. If you have accidentally set the item to generic, this will make it a spawnable item which won't be classed as furniture. Please make sure to set it to furniture. --- ### Currencies #### Overview[​](#overview "Direct link to Overview") **Gold** Gold currency can be purchased with real money by users or it can be made by creators by selling items in the Sinespace shop for Gold. ##### **Gold**[​](#gold "Direct link to gold") Gold currency can be purchased with real money by users or it can be made by creators by selling items in the Sinespace shop for Gold. Gold currency can be purchased at an approximate 100:1 ratio against the USD ($). To learn more about payouts from Gold sales, see the [Payout](/curator-dashboard/payout.md) page. ##### **Silver**[​](#silver "Direct link to silver") Silver currency is free promotional currency given to users as rewards for socialising, attending events or participating in various in-world activities. You can also sell items for Silver in the Shop. Creators can also create quest and games that reward silver currency - for this you require a token from us. info Please note that Silver cannot be converted to real money through our payout system You can set each item you want to sell to gold only, silver only or any combination of the two. To sell your items as only gold or silver only, you need to set the other currency as -1 or check the No Gold or No Silver boxes on the item Edit menu on Curator. --- ### Currencies - Gold and Silver #### Overview[​](#overview "Direct link to Overview") 1. Gold Gold credits can only be purchased for real money by spending users and can be converted back to real money by Sine Wave virtual goods partners. 2. Gold Gold credits can only be purchased for real money by spending users and can be converted back to real money by Sine Wave virtual goods partners. Gold credits trade at 100 / 1 fixed ratio with USD$ 1. Silver Silver credits are free promotional credits given to users as rewards for participating in the community. Silver credits cannot be converted to real money but can be used by creators to promote their content to new platform users who have not yet purchased gold. 1. Pricing strategies You can set each item you want to sell to gold only, silver only or any combination of the two. As a guiding principal we would recommend making most of your inventory gold only but offering a few items for silver as well, perhaps 10% of total inventory, to help promote your goods to a wider audience and to give the platform a richer pool of content for new users to explore before they buy gold. --- ### Editing Item Info #### Overview[​](#overview "Direct link to Overview") You can update an items' information on the Curator Dashboard via the Edit button. You can update an items' information on the Curator Dashboard via the Edit button. All information can be updated, or you can update some of it. ![](/assets/images/itemchanges-3a07d0afda0401e01b312c9a6026d2c5.png) * **Product Name** - This is the name of your item. The name will be displayed in the Sinespace Shop and in the Inventory. * **Brand** - This is your brand name. Brand names will be displayed in the Sinespace Shop and in the Inventory. * **Developer** - This can be either your real name or Sinespace username. This will not be displayed in the Sinespace Shop or Inventory, it will only be visible on the Curator Dashboard. * **Copyright** - This can be either your real name or Sinespace username. This is used to protect your items from unauthorized duplication. * **Category** - This is the Sinespace Shop category your item will be listed under. If you are not familiar with the categories, please check the shop first before changing this. * **Description** - This is the items' description; try to include as much information as possible here. * **Rating** - This is the items' suitability rating. The ratings are Everyone, Teen, Mature, Adult and Explicit. * **Gold** - This is the amount of Gold the item is selling for in the Shop * **Silver** - This is the amount of Silver the item is selling for in the Shop * **Max Discount** - This is the max discount you want to apply to the item during Shop sales. * **No Gold** - If this is checked, the item will not sell for Gold. * **No Silver** - If this is checked, the item will not sell for Silver. * **No Discount** - If you do not want your item to be included in Shop sales, check this box. warning Make sure to fill in the description for each item or your changes won't be saved! --- ### InventoryVendor #### Overview[​](#overview "Direct link to Overview") Fields Curator ID ID of the product Display Name UI canvas of the Name Display Silver Drop the canvas for Silver price Display Gold Drop the canvas for Silver price Usage There is ![](/assets/images/400px-inventoryvendor-c5f04b80381be0f172bd99ea851add8c.jpg) #### Fields[​](#fields "Direct link to Fields") ###### Curator ID[​](#curator-id "Direct link to Curator ID") ID of the product ###### Display Name[​](#display-name "Direct link to Display Name") UI canvas of the Name ###### Display Silver[​](#display-silver "Direct link to Display Silver") Drop the canvas for Silver price ###### Display Gold[​](#display-gold "Direct link to Display Gold") Drop the canvas for Silver price #### Usage[​](#usage "Direct link to Usage") There is an example in Sample art/vendor folder of the Editor Pack. Curator ID Id of the product your wish to sell, you can see this ID under virtual goods of your uploaded item. Canvas Display Set the canvas display for Name, Silver price and Gold price. --- ### Item Statuses #### Overview[​](#overview "Direct link to Overview") An items' status relates to the upload process. An items' status relates to the upload process. The statuses are: * **Failed** - This means your content has failed to upload * **Uploaded** - This means your content is uploaded but it hasn't started processing, it's waiting in the queue * **Processing** - This means your content has started processing * **Staging** - This means your content has finished processing and is now on our preview servers * **Review** - This means your content has been sent to review and is being reviewed by our team * **Rejected** - This means our team have rejected the item * **Live** - This means your content is on our live servers, either in the Sinespace Shop or in your Inventory If your items' status is 'staging' you can review the item in-world on our preview servers to check it before you send it to review. To log into the preview server, open the Sinespace viewer, enter your login details and check the Preview Server box. Your item will be found in your Inventory. If you are happy with your item, click on the 'Send to Review' button. ![](/assets/images/sendtoreview-a5566c97a47b22419c15df1ad0d18891.png) The item status will change to 'Review'. If the item is approved by our team, the item will be pushed to the live servers and the items' status will change to 'Live'. warning It may take up to 24-48 hours for our team to review your item depending on queue size If the item is rejected, the status will change to 'rejected' and you will see a moderation reply on the item: ![Moderator reply will be shown at the bottom if the item is rejected.](/assets/images/rejected-b631ce6ee9ea9dcbdbe285e0f3144257.png) The moderation reply will include the reason why it was rejected and suggestions on how to fix the problem. When the item is fixed, you can send it for review again. --- ### Promotional Sales #### Overview[​](#overview "Direct link to Overview") You can sell your items in Sinespace for a discounted price via promotional sales. You can sell your items in Sinespace for a discounted price via promotional sales. Promotional sales mean that any silver item you have might be given away freely or included on base starter avatars. If your item is selling for Gold, this may be included in platform based sale events. The promotional sales option is under the Virtual good component. When you have added the virtual good component to your item, go to the 'Pricing' tab. To allow use in promotions, check the 'Allow Use in Promotions' box. You can adjust the Max Discount in Sales slider to whatever amount you want the max discount to be. This setting is percentage, so if you set it to 20, this will be 20% off. Once you have set this, you can continue to upload your item as normal via the virtual good component. --- ### Overview #### Overview[​](#overview "Direct link to Overview") **Curator Dashboard** lets you manage all your contents uploaded to Sinespace. [**Curator Dashboard**](https://curator.sine.space/) lets you manage all your contents uploaded to Sinespace. You will be able to track sales, change item information and payout your earnings from here. To use Curator Dashboard, log in using the username and password you used to create your Sinespace account. If you are a Unity creator who opted in using [Sine Wave Publisher program](https://assetstore.unity.com/browse/publisher-sinespace-signup), you would have received an email containing your email and password. If you are logging into the Curator Dashboard for the first time, you will need to accept the EULA. info You can change your password on the [Sinespace Account](https://sine.space/user/account_settings) page. ##### Settings and Profile[​](#settings-and-profile "Direct link to Settings and Profile") To update your business and brand information, click on the Settings tab of the Curator Dashboard. You can opt-out of status change emails by checking 'Do not send emails' under the Email section of the Settings tab. ![Profile under the Settings tab](/assets/images/curatorsettings-1dcfd1240353f9e1681bb1fd74365660.png) To learn how to curate items, payouts, transactions or manage your grid, visit the relevant pages: * [Items](/curator-dashboard/items.md) * [Payout](/curator-dashboard/payout.md) * [Transaction](/curator-dashboard/transaction.md) --- ### Payout #### Overview[​](#overview "Direct link to Overview") The payout tab on the Curator Dashboard lets you payout your Gold sales earnings in either Gold or USD. The payout tab on the Curator Dashboard lets you payout your Gold sales earnings in either Gold or USD. ![](/assets/images/payout-4e79dde5b08673cabce13ec42d04b12d.png) Please be aware that all payouts, whether made to Gold or USD are dependent on a completed & signed Developer agreement which will be sent to you via Docu-sign after you raise your 1st payout request. For 1st time payouts we will email the Developer agreement to the email address on your Sinespace account. A note will be added to your payout request on Curator stating which email address this has been sent to and on which date. Please make sure the email address is accessible and correct; if you need to change this email, please send us a ticket via [support](https://support.sine.space/support/home) to have the email address changed. Once you have signed the Developer Agreement, we will start the payout process; Remember to download a copy of the signed version for your records. If you want to receive payouts in cash, please add your PayPal information to the Development Agreement. info You only need to sign the Developer Agreement one time, for subsequent payouts this is not required ##### Payout with Gold[​](#payout-with-gold "Direct link to Payout with Gold") To payout with Gold, you will need a **minimum of 5000 Gold** worth of sales on your account. You will need to enter the amount of Gold you wish to have paid out; you can choose to payout the whole amount or a specific amount, but it must be above 5000 Gold. info Please note that payout requests are processed every 14 days, at the end and in the middle of each month. When you raise a payout request, your ticket on Curator will state; β€œrequest is pending a review” Once your payout is processed, a note will be added to your ticket on Curator stating that the payout has been completed. Log into the Sinespace viewer and refresh your Gold amount to see your new balance. Please remember the Gold balance is subject to the deduction of the cut to Sinespace as per your Developer Agreement. ##### Payout with Cash[​](#payout-with-cash "Direct link to Payout with Cash") To payout out with cash, you will need a **minimum of 5000 Gold** worth of sales on your account. You will need to enter the amount of Gold you wish to payout with; you can choose to pay out the whole amount or a specific amount. info You will need at least 5,000 Gold equivalent sales to do a payout (approx. $35 after our 30% cut and transaction fees). When you raise a payout request your ticket on Curator will state; β€œrequest is pending a review”. Once it is reviewed we will start the payout process. All our cash payouts are made using PayPal. When the payment has been made, you will see a note on Curator stating the payout is completed. Please check your PayPal account to see the amount added. A statement/invoice will also be emailed to you, this shows the payout deductions and depending on where in the world you are, it will have the relevant TAX/VAT added. --- ### Resume ID Curator #### Overview[​](#overview "Direct link to Overview") Resume IDs are used when you want to re-upload the same item to space but don't want to duplicate multiples of the same item in your inventory or in the shop. Resume IDs are used when you want to re-upload the same item to space but don't want to duplicate multiples of the same item in your inventory or in the shop. You can find the items' ID in your [Curator](https://curator.sine.space/) Items panel. ![ResumeIDcurator.png](/assets/images/resumeidcurator-3a56117d07bc3630953f32c6e4f31b84.png) Once you have this number written down, Open Unity. When Unity is open, find the item you took the ID from, for example, mine was Long Shorts. In the Inspector window, you will see all of the information you have completed already for the item. You will need to scroll in the Inspector window until you see this. ![Resumeidunity.png](/assets/images/resumeidunity-e785e056568f704439a269ff29f13c9d.png) Enter the ID you just noted down, and put it in the Resume ID box. Once this done, click on 'Apply Resume ID'. Scroll down to Automatic Submission, and this will upload the same item with the same ID! --- ### Transaction #### Overview[​](#overview "Direct link to Overview") Under the Transactions tab, you have the options to see all of your sales, see Gold item sales, Silver item sales and Tip sales. Under the Transactions tab, you have the options to see all of your sales, see Gold item sales, Silver item sales and Tip sales. You can also export the transactions lists as an CSV to keep as a reference. ![](/assets/images/transactions1-9f0c0c2f2a80d5daf51a15253f7b0190.png) ##### Sales List[​](#sales-list "Direct link to Sales List") The Sales List will show the most recent transaction. You can use the pink date buttons to search for a transaction within a certain time period, or you can click on the 'Show All' button to show every single transaction. You can sort the transactions using the date button; they will be sorted by ascending or descending dates. The transaction will be shown as the transaction ID, time of transaction, customer username, product and revenue amount. ##### Exporting as CSV[​](#exporting-as-csv "Direct link to Exporting as CSV") You can export transactions as a CSV to keep for your records. You can choose to export all your transactions to CSV, or you can select a time period using the pink date buttons to export transactions from that time period to CSV. ##### Gold List[​](#gold-list "Direct link to Gold List") The Gold List shows all of the transactions on sales of your Gold items. You can search and sort the transactions the same way you would on the sales list. ##### Silver List[​](#silver-list "Direct link to Silver List") The Silver List shows all of the transactions on sales of your Silver items. You can search and sort the transactions the same way you would on the sales list. ##### Tips List[​](#tips-list "Direct link to Tips List") The Tips List shows all of the transactions made via the in-world tip function. This is generally used for DJ's and performers. ##### Top Gold[​](#top-gold "Direct link to Top Gold") The Top Gold list will show the transactions of sales on the most sold Gold items. ##### Top Silver[​](#top-silver "Direct link to Top Silver") The Top Silver list will show the transactions of sales on the most sold Silver items. ##### Top Tips[​](#top-tips "Direct link to Top Tips") The Top Tips list will show the transactions of sales for the highest amount of tips received from the in-world tip function. --- ## Policies ### Policies #### [πŸ“„οΈContent Processing](/policies/content-processing.md) [Content Processing Content Processing When you upload a piece of content to our servers, we run a variety of processes on it before building the final export packages.](/policies/content-processing.md) --- ### Certified Creators Program #### Overview[​](#overview "Direct link to Overview") Certified Creator status will bestow additional privileges to content developers (varying a little based on grade), up to and including granting some developers with the rights to Certified Creator status will bestow additional privileges to content developers (varying a little based on grade), up to and including granting some developers with the rights to publish to the marketplace directly without the normal review process; and a host of other benefits. ##### Program Details[​](#program-details "Direct link to Program Details") Our Certified Creators Program has a few grades of certification, the highest grade being Platinum Grade and the lowest being Gold Grade. ###### Platinum Grade[​](#platinum-grade "Direct link to Platinum Grade") With this grade you will be able to list and update content directly in the marketplace without our assistance. ###### Gold Grade[​](#gold-grade "Direct link to Gold Grade") Gold Grade creators will be able to push content live without review if the item is deemed as a 'personal use item' (such as personal regions, and other content with limited distribution options). To achieve both these grades, you will need to have submitted a signed copy of our creator agreement back to us, and have already submitted a collection of items to review. Access to these programs is by invitation. We are looking for creators with a consistent demonstration of the following; * Commitment to producing content that does not interfere with others rights. * A track record of complying with the resource limits we place on items such as clothing * Honorable behavior when interacting with reviewers, customers and other platform users. To achieve the Gold Grade we need to see at least a few items passing review successfully, for the higher platinum grade, a much larger quantity of original work over a longer period of time is required. Invitations to the platinum grade will be personally reviewed and approved by our senior management. ##### FAQs[​](#faqs "Direct link to FAQs") ###### Can I queue jump to the higher grades?[​](#can-i-queue-jump-to-the-higher-grades "Direct link to Can I queue jump to the higher grades?") Generally no, however if you are an established developer in a large digital marketplace who have a library of high quality content and a solid reputation known to us, earned over a long period of time, we will factor that into our decision making and may allow a expedited entry; but generally we prefer to recognise and reward creators who have worked within the platform already. ###### I'm a customer, will this affect the quality of items I buy?[​](#im-a-customer-will-this-affect-the-quality-of-items-i-buy "Direct link to I'm a customer, will this affect the quality of items I buy?") No - besides having strict criteria on who can participate (and having a established track record), we still will be reviewing items submitted to the marketplace this way. We'll just be doing so after they have been approved by the creator. Our goal is to ensure you know that when you buy something in our marketplace, it works as intended and meets all of our other quality guidelines for paid content. ###### What happens if a creator approves something themselves that is later rejected by a reviewer?[​](#what-happens-if-a-creator-approves-something-themselves-that-is-later-rejected-by-a-reviewer "Direct link to What happens if a creator approves something themselves that is later rejected by a reviewer?") Depending on the severity of the error (we will particularly frown on malicious actions or carelessness, such as not testing an item before approving; or approving an item knowingly breaking one of our rules) we may withdraw the right to self-approve content, permanently. If you as a customer buy an item that fails our own internal review, there will be a few options we will pursue to protect your rights as a customer; we may do any of the following; β€’ Refund and withdraw the item from the platform, or β€’ Temporarily suspend new sales and give the creator the opportunity to fix it, or β€’ In the case of updates, revert it to a previous approved version. ###### Are there any other perks?[​](#are-there-any-other-perks "Direct link to Are there any other perks?") Yes, besides self-review options - both grades of creators will get a few added perks. β€’ First you'll get access to unique inworld titles β€’ You'll also get the right to use a special partner logo on your websites and promotional imagery that indicates our recognition of your consistent high quality. You can even use it as a badge in other marketplaces if you want. β€’ We will also allowing the marketplace search to filter by certification grade in a future update. ###### I'm a creator, what if I'm unsure about an item?[​](#im-a-creator-what-if-im-unsure-about-an-item "Direct link to I'm a creator, what if I'm unsure about an item?") If you're an approved creator who can self-review, but are on the edge whether something is going to be okay or not, never fear - the existing review process is still available. Just drop it in the review queue as normal, and we'll evaluate it - if you get a rejection, we won't count that against you or your certification status. If you would like further information on the program, please contact us on our [Discord server](https://discord.gg/sinespace) or email us directly at . --- ### Content Processing #### Overview[​](#overview "Direct link to Overview") Content Processing When you upload a piece of content to our servers, we run a variety of processes on it before building the final export packages. #### Content Processing[​](#content-processing "Direct link to Content Processing") When you upload a piece of content to our servers, we run a variety of processes on it before building the final export packages. We build one package per platform (e.g. one for WebGL, one for standalone, one for each mobile OS, one for each console.) This processing does take some time to perform depending on the content type. Regions typically take around 15 minutes to process depending on their size (a large multi-gigabyte region can take up to an hour), whereas virtual goods (such as [Clothing](/sinespace-sdk/avatars/clothing.md), [Gestures](/sinespace-sdk/avatars/gestures.md) or [Vehicles](/sinespace-sdk/vehicles.md)) less than 5mb will process usually within 20 seconds. The content will go through a series of steps to be uploaded to the Sinespace client: 1\. After you have clicked on the Automatic Submission button on the virtual good component, your item will be being uploading to our servers. You will receive a notification stating this on your registered email address. You can also check on curator.sine.space to see the status of the upload. At this stage, the status of your item will read 'Processing'. 2\. Once the item has processed, you will receive another email stating that your item is now on staging. This will be reflected on [Curator](http://curator.sine.space/) as well, with your item having the 'Staging' status. You will need to log into Curator to see the progress of your item. Now you can preview the item and check it is working correctly on our preview servers. You can do this by starting the Sinespace client, and tick the 'Preview Server' box and log in as usual. 3\. If you are happy with your content and it is working/showing correctly, you can then send the item to be reviewed by our review team. You can do this on curator by clicking on the 'Send to Review' button. ![250px-Reviewbutton.png](/assets/images/250px-reviewbutton-aca7825203b3eb270163f8e905ec7e6a.png) 4\. Our team will review your content and decide whether or not to accept it and push it to our live servers or reject the item. If the item is rejected, the team will add a note to it on curator to say why it has been rejected. If you don't receive a note, please send us a [support ticket](http://support.sine.space/support/home) and we will look into the issue with the content. You will need to fix the issue and then re-upload the item with the same item ID. You can see how to use the same ID here. 5\. If your item is accepted, we will push it to the live servers. The region or virtual goods will then be available to all users in the 'Explore' tab (for regions) or in the Shop for virtual goods. The content will not show up in the Shop if you have set it as 'Not for Sale'; it will only show in your inventory. #### Content Queue[​](#content-queue "Direct link to Content Queue") When you upload content for processing it, we will process it in the order it is received, with a handful of exceptions. Virtual Goods less than 10mb in size will always process on a separate priority queue regardless of account status (this is to ensure you can quickly preview content that does not take long to process). Other content will process on the larger region queue. We have a separate priority region queue for customers subscribing to a large region plan. Generally speaking we do aim for content to process quickly; during periods of large user growth, we may need to add additional processing servers #### What happens to your content[​](#what-happens-to-your-content "Direct link to What happens to your content") ##### Textures[​](#textures "Direct link to Textures") ![200px-Upload-settings.png](/assets/images/200px-upload-settings-e121e7fc6c54b883e1776f92b06252a2.png)The texture importer settings are respected by Space's content processor when exporting content Depending on the platform your textures are likely to be re-compressed into a native format for that platform, e.g. DXT1/5 on Standalone, JPEG for WebGL, etc. you can configure these settings prior to upload in the 'Importer'. We recommend against picking a specific format, and instead using the 'Automatic True Colour / Automatic Compressed / Automatic Crunched / Automatic 16-bit' master options; as specific formats may be substituted on a platform by platform basis. ##### Models & Meshes[​](#models--meshes "Direct link to Models & Meshes") We will strip mesh data down into a compact binary format. The specific format varies platform to platform (such as using 16-bit precision on mobile, and 32bit on desktop). Included animations will be often converted into rotational space, and re-sequenced onto a series of timelines. We may also strip data which is not being used by your materials (e.g. Vertex Colours or UV3/4 if your shaders do not require them.) #### Reprocessing[​](#reprocessing "Direct link to Reprocessing") From time to time, we make make changes to our packaging formats, either to introduce new compression schemes or allow for new features to be supported. Often this will break compatibility with previous releases; so we have support for content reprocessing. When your content is published, we keep a copy of the original files uploaded to the processing server and can use these to automatically reprocess content into the newer formats. Generally this should not require any intervention on your part. --- ### Content Protection #### Overview[​](#overview "Direct link to Overview") Preamble While the Sinespace platform is a closed platform, it is simply not possible to guarantee any form of copy protection. ###### Preamble[​](#preamble "Direct link to Preamble") While the Sinespace platform is a closed platform, it is simply not possible to guarantee any form of copy protection. With that said, we do implement features which make "content ripping" harder. While technical measures *cannot be guaranteed* - we do attempt to also limit the applicability and usefulness of ripped content through social and legal means, including our content review process. ###### Content Formats[​](#content-formats "Direct link to Content Formats") Uploading content to the Sinespace platform is a destructive process; our compression systems actively strip and reformat content into specialised formats. Further; many of these formats involve lossy compression (e.g. DXT texture compression) of some form of another. For example: when you upload a FBX file containing an animation, our tools will in the process of packaging strip out the skeletal data, remove the associated meshes, and reformat the animation timeline into a custom format - the original FBX is not delivered to the end users client (although it will be stored on our processing servers in case of future reprocessing in the event of format changes). Usually we will also strip redundant (not used) information from the mesh, such as unused vertex colours or higher UV channels (UV3/4); if it can be determined at build time that this information is redundant. It should be noted that while this provides a roadblock to extracting content, a *dedicated reverse engineer will be able to restore a semblance of the original files*; either by decoding the formats we utilise - or extracting from the GPU using existing tools designed for graphics debugging (specifically not mentioning any by name here). As with the music and movie industries - there is no technological 'silver bullet'. ###### What can be done?[​](#what-can-be-done "Direct link to What can be done?") While technological methods are doomed to long term failure - social and legal means are not. The Sinespace platform is a closed environment, this means all content needs to be routed through our systems and processes - for the majority of users, this will also include content review, where our teams inspect all content prior to upload. One of the goals of content review is to prevent and prohibit ripped content from being sold or distributed in the Sinespace platform. Penalties for knowingly uploading infringing content include permanent removal from the service, through to legal enforcement (don't do it.). See [Content Review](/policies/review-policies/content-review-policy.md) for more information. A good comparison example for how Sinespace operates is to compare the App Store and Google Play marketplaces - by placing a more stringent review, greater identification requirements and a delay on cashouts, the Apple store is considerably better at disincentivising infringements. Both platforms employ similar levels of DRM. ###### Copying, Single Source, Marketplace[​](#copying-single-source-marketplace "Direct link to Copying, Single Source, Marketplace") The Sinespace backend design means every user copy of a item is shared from a single master copy of the item. If that master item is removed from the service - all copies will vanish with it. If an item is placed onto the service despite review processes, it is an option for the original owner to have every copy of the item removed or replaced in a single instance. Additionally, all content sales occur within the platform itself where they can be monitored and all details recorded. We also offer a central marketplace managed and operated by us, where we aim to guarantee that all the content is legitimate, and can provide a curated high quality marketplace. By encouraging users to utilize the Sinespace marketplace we can maintain user trust that they are buying authentic goods from the authorized sellers - and ensure they understand the original creators are being paid for their work. ###### Social v. Technical Enforcement[​](#social-v-technical-enforcement "Direct link to Social v. Technical Enforcement") While technical means can be used to slow or delay a infringement, we prefer to rely on social and legal methods; our social & legal methods include: * All uploaded content is subject to a manual review by our art inspection team. * All content uploaded onto our live servers for sale requires a enforceable contract between Sine Wave Entertainment, and the uploading user. * Content sales are subject to a mandatory waiting period between sale and cash-out period; this allows us to hold revenues from infringed content. ##### Intellectual Property[​](#intellectual-property "Direct link to Intellectual Property") ###### Copyright, Trademark and IP Policies[​](#copyright-trademark-and-ip-policies "Direct link to Copyright, Trademark and IP Policies") The Sinespace Platform is a creative platform - we wish to encourage all creators to upload original innovative content to our platform. When uploading content to our platform however, we request that you do not infringe on other peoples works. This includes incorporating materials such as trademarks from popular brands or other third parties without their explicit consent. ###### Preventing Infringement[​](#preventing-infringement "Direct link to Preventing Infringement") * The Sinespace Platform is a curated service, we aim to personally review most content uploaded onto the service. While this does not guarantee we can prohibit all infringing content (particularly that which we do not recognize), we do aim to limit the need for duplicate complaints over the same content. * We require a point of contact for all content uploaded to the service, and a contract for all content uploaded for sale. (This does allow us to trace who is responsible for all content uploaded onto the platform) * We operate with a delay between item purchases and cash-outs to developers - this period allows us to retain funds for infringed content, and limit profiting from any infringing content. ###### Content Takedowns[​](#content-takedowns "Direct link to Content Takedowns") If you believe someone has uploaded your IP (or IP for someone you formally represent), you may submit a take-down request to us. While we will honour DMCA takedown requests, please note we are a UK company, and the appropriate form to use is a EU "Article 14" Notice and Take Down as specified under the Electronic Commerce Directive. For fastest processing, please raise a [support ticket](http://support.sine.space/support/home) with the Regarding field as 'IP & Copyright Infringement'. For physical notices of infringement, please mail to ```text RE: IP ENFORCEMENT SINE WAVE ENTERTAINMENT LTD. 22A St. James's Square London, SW1Y 4JH, United Kingdom Phone: +44 (0) 207 078 7449 ``` or email: Please include: * Where you saw the content (the name or direct URL of a region, our shop front, or an avatar name.) * A screenshot of the infringing content, or the content it is designed to look like. * The time, date and timezone of when you saw the infringing content. * Any details about the content (such as name or creator) * On what grounds you believe this to be infringing content ("I developed this and did not provide authorization") And one (or both) of: * The details of the copyright or trademark registration regarding this content. If it is not formally registered, please provide evidence that you are the true copyright holder (e.g. in the case of a 3D model, we will accept screenshots of the source files or a link to a promotional website registered prior the upload date with your name attached). * A signed legal affirmation that you are, or represent the true owner of the content. The more information you can provide about a piece of infringing content, the faster we can handle removing it. We have a strong respect for the intellectual property of creators, and will always do our best to process such infringements promptly. ###### Right of Reply[​](#right-of-reply "Direct link to Right of Reply") If there is a gray area over a piece of content, and we are not able to sufficiently or reasonably identify the infringement from the materials supplied - but you have provided some evidence or an affirmation stating ownership, we will ask the uploader to respond within 3 business days before making a judgement and possibly removing the content. If they fail to respond in this time, or respond inadequately, we will remove the content. For that reason, please include as much documentation of the infringement as possible, and evidence of your ownership to limit our need to do this; acceptable evidence could include: * Copyright registration information * Links to where the item was originally sold, and some proof you own these listings. * Screenshot of source files with destructed material (e.g. Photoshop document with layers window visible) that are not already public. ###### Put Back Notices[​](#put-back-notices "Direct link to Put Back Notices") If you believe your content was unjustly removed, you will need to state your case, and provide as much documentation and evidence that we have erred in removing your content; as reinstating your content may impose legal liability on us, we will require proof well beyond reasonable doubt that you authored this content, and that the original complaint was fraudulent or incorrect. In cases where there are multiple copyright owners, we will require assurances from all owning parties prior to reinstatement. ###### Suspensions, Violation of Terms[​](#suspensions-violation-of-terms "Direct link to Suspensions, Violation of Terms") If you are found to have uploaded unauthorized content, your right to sell in the Sinespace marketplace may be suspended or banned. Furthermore, you may be liable for any legal costs imposed on Sine Wave Entertainment dealing with your infringement. See the Sinespace Content Agreement for further information, but in short; *do not upload unauthorized content*. --- ### End-User License Agreement #### Overview[​](#overview "Direct link to Overview") Agreement THIS AGREEMENT IS BETWEEN SINE WAVE ENTERTAINMENT LTD (β€œCOMPANY”), AND YOU, THE CREATOR UPLOADING CONTENT ONTO OUR SERVERS (β€œSUPPLIER”). #### Agreement[​](#agreement "Direct link to Agreement") THIS AGREEMENT IS BETWEEN SINE WAVE ENTERTAINMENT LTD (β€œCOMPANY”), AND YOU, THE CREATOR UPLOADING CONTENT ONTO OUR SERVERS (β€œSUPPLIER”). *The Parties agree to the following:* 1. Content includes any intellectual property, designs, 3D model files, source files, related to products intended for distribution on the Platforms 2. The company reserves the right to discontinue hosting content at its discretion, including but not limited to content review policies, and/or excessive or abusive use of the service. 3. As a Supplier, you agree to the following terms for the content submitted for inclusion on the Platforms: * A. The Supplier agrees to act in good faith, and verify content submitted does not include copyrights, trademarks or intellectual property that the Supplier does not have permission to include. * B. The Supplier will not upload content designed to cause harm to users of the Platforms, including but not limited to, computer viruses, content designed to trigger photosensitive epilepsy, or other content with malicious intent. * C. The Supplier retains all ownership of any intellectual property submitted to the Company, however the Supplier agrees to provide a world-wide, perpetual, non-exclusive license to use that content in any way the Company needs for the purposes of pursuing this agreement. * D. For the purposes of allowing content received by end-users to remain available to them, the right to display and distribute the content on the Platforms survives any termination of this agreement. * E. The Company has no obligation to distribute the content to end-users, and may not include, or discontinue the content from sale, distribution or inclusion in the Platforms at its will. * F. The Company has the right to use the content, and the names of the developers and any associated trademarks, in marketing and promotional materials related to the Platforms. 4. The relationship between the parties shall at all times be that of independent contractors. No employment, partnership or joint venture relationship is formed by this agreement and at no time may the supplier position itself as affiliated to the Company, except as an independent supplier. In view of this independent relationship the Supplier shall not enter into any agreements on behalf of the Company, shall make no warranty either expressed or implied on behalf of the Company and shall not incur any expenses on behalf of the Company. 5. This agreement does not grant exclusive rights to the Supplier and the Supplier shall have no rights under any other agreements entered into by the Company with other Suppliers. Likewise, this agreement does not grant exclusive rights to the Company, except where otherwise agreed by both parties. 6. The Supplier agrees not to disclose any confidential information pertaining to the Company's goods or services nor that of prospective or existing customers to any third party. This clause survives any termination of this agreement for five years from the date of termination. 7. Either party may terminate this agreement at any time by giving the other party thirty (30) days prior written notice. Upon termination existing content granted to users within the Platforms will remain unaffected and existing customers using the Supplier's content will be able to continue their use under the terms of the Platforms. 8. The supplier specifically indemnifies the Company against all intellectual property claims (including but not limited to Copyrights, Trademarks, Patents and Trade Secrets) that may arise and warrants that all content supplied under the agreement is owned by the supplier or licensed for resale under terms that meet the terms and conditions of the Company's Platforms. 9. The Company may choose to terminate this agreement automatically in the event that the Supplier has provided unlicensed intellectual property from third parties. The Supplier agrees to pay any and all costs incurred by the Company resulting from the inclusion of unlicensed intellectual property, including but not limited to legal fees, settlements, costs in removing the content, and refunding consumers. 10. From time to time, the Company may amend this agreement with 30 days’ notice – continued use of the service constitutes acceptance of these amended terms. 11. This agreement constitutes the whole agreement between the parties and any alteration must be in writing and signed by both parties. 12. The parties hereby agree that this Agreement shall be construed in accordance with English Law, and the courts of London, United Kingdom. #### Payment Agreement[​](#payment-agreement "Direct link to Payment Agreement") *For items for sale, please see* [*Payment EULA*](/policies/payment-eula.md) --- ### Intellectual Property #### Overview[​](#overview "Direct link to Overview") Copyright, Trademark and IP Policies The Space Platform is a creative platform - we wish to encourage all creators to upload original innovative content to our platform. ##### Copyright, Trademark and IP Policies[​](#copyright-trademark-and-ip-policies "Direct link to Copyright, Trademark and IP Policies") The Space Platform is a creative platform - we wish to encourage all creators to upload original innovative content to our platform. When uploading content to our platform however, we request that you do not infringe on other peoples works. This includes incorporating materials such as trademarks from popular brands or other third parties without their explicit consent. ##### Preventing Infringement[​](#preventing-infringement "Direct link to Preventing Infringement") * The Space Platform is a curated service, we aim to personally review most content uploaded onto the service. While this does not guarantee we can prohibit all infringing content (particularly that which we do not recognise), we do aim to limit the need for duplicate complaints over the same content. * We require a point of contact for all content uploaded to the service, and a contract for all content uploaded for sale. (This does allow us to trace who is responsible for all content uploaded onto the platform) * We operate with a delay between item purchases and cashouts to developers - this period allows us to retain funds for infringed content, and limit profiting from any infringing content. ##### Content Takedowns[​](#content-takedowns "Direct link to Content Takedowns") If you believe someone has uploaded your IP (or IP for someone you formally represent), you may submit a take-down request to us. While we will honour DMCA takedown requests, please note we are a UK company, and the appropriate form to use is a EU "Article 14" Notice and Take Down as specified under the Electronic Commerce Directive. For fastest processing, please [raise a support ticket](https://sine.space/support) with the Regarding field as 'IP & Copyright Infringement'. For physical notices of infringement, please mail to ```text RE: IP ENFORCEMENT SINE WAVE ENTERTAINMENT LTD. 22A St. James's Square London, SW1Y 4JH, United Kingdom Phone: +44 (0) 207 078 7449 ``` or email: Please include: * Where you saw the content (the name or direct URL of a region, our shop front, or an avatar name.) * A screenshot of the infringing content, or the content it is designed to look like. * The time, date and timezone of when you saw the infringing content. * Any details about the content (such as name or creator) * On what grounds you believe this to be infringing content ("I developed this and did not provide authorisation") And one (or both) of: * The details of the copyright or trademark registration regarding this content. If it is not formally registered, please provide evidence that you are the true copyright holder (e.g. in the case of a 3D model, we will accept screenshots of the source files or a link to a promotional website registered prior the upload date with your name attached). * A signed legal affirmation that you are, or represent the true owner of the content. The more information you can provide about a piece of infringing content, the faster we can handle removing it. We have a strong respect for the intellectual property of creators, and will always do our best to process such infringements promptly. ##### Right of Reply[​](#right-of-reply "Direct link to Right of Reply") If there is a gray area over a piece of content, and we are not able to sufficiently or reasonably identify the infringement from the materials supplied - but you have provided some evidence or an affirmation stating ownership, we will ask the uploader to respond within 3 business days before making a judgement and possibly removing the content. If they fail to respond in this time, or respond inadequately, we will remove the content. For that reason, please include as much documentation of the infringement as possible, and evidence of your ownership to limit our need to do this; acceptable evidence could include: * Copyright registration information * Links to where the item was originally sold, and some proof you own these listings. * Screenshot of source files with destructed material (e.g. Photoshop document with layers window visible) that are not already public. ##### Put Back Notices[​](#put-back-notices "Direct link to Put Back Notices") If you believe your content was unjustly removed, you will need to state your case, and provide as much documentation and evidence that we have erred in removing your content; as reinstating your content may impose legal liability on us, we will require proof well beyond reasonable doubt that you authored this content, and that the original complaint was fraudulent or incorrect. In cases where there are multiple copyright owners, we will require assurances from all owning parties prior to reinstatement. ##### Suspensions, Violation of Terms[​](#suspensions-violation-of-terms "Direct link to Suspensions, Violation of Terms") If you are found to have uploaded unauthorised content, your right to sell in the space marketplace may be suspended or banned. Furthermore, you may be liable for any legal costs imposed on Sine Wave Entertainment dealing with your infringement. See the Space Content Agreement for further information, but in short; *do not upload unauthorised content*. --- ### Payment EULA #### Overview[​](#overview "Direct link to Overview") 1. THIS IS A SAMPLE OF THE SUPPLIER AGREEMENT USED WHEN SUBMITTING CONTENT FOR SALE IN THE SPACE MARKETPLACE For non-sale items, the standard End-User License Agreement applies. 2. THIS IS A SAMPLE OF THE SUPPLIER AGREEMENT USED WHEN SUBMITTING CONTENT FOR SALE IN THE SPACE MARKETPLACE For non-sale items, the standard [End-User License Agreement](/policies/end-user-license-agreement.md) applies. Before selling content, you will need to sign a copy of this agreement and return it to Sine Wave. We'll contact you when you first submit an item for sale in the marketplace. #### Agreement[​](#agreement "Direct link to Agreement") Whereas the Supplier may license content for sale within the Company's virtual world platforms ("Platforms"), and whereas the supplier and company agree to share the revenue from sales of these licensed items as of the effective date, \_\_\_\_ of \_\_\_\_\_\_\_\_**, 20**. The Parties agree to the following: Content includes any intellectual property, designs, 3D model files, source files, related to products intended for distribution on the Platforms As a Supplier, you agree to the following terms for the content submitted for inclusion on the Platforms: The Supplier agrees to act in good faith, and verify content submitted does not include copyrights, trademarks or intellectual property that the Supplier does not have permission to include. The Supplier will not upload content designed to cause harm to users of the Platforms, including but not limited to, computer viruses, content designed to trigger photosensitive epilepsy, or other content with malicious intent. The Supplier retains all ownership of any intellectual property submitted to the Company, however the Supplier agrees to provide a world-wide, perpetual, non-exclusive license to use that content in any way the Company needs for the purposes of pursuing this agreement. For the purposes of allowing content received by end-users to remain available to them, the right to display and distribute the content on the Platforms survives any termination of this agreement. The Company has no obligation to distribute the content to end-users, and may not include, or discontinue the content from sale, distribution or inclusion in the Platforms at its will. The Company has the right to use the content, and the names of the developers and any associated trademarks, in marketing and promotional materials related to the Platforms. 70% of the net revenues from the sale of licensed content created by the Supplier and sold by the Company in the Platforms shall be distributed to the Supplier. Net revenues shall be defined from Gross Revenues, less any costs directly resulting from the sales of licensed content, or the purchase of the In-Platform Currency used by the end consumer to purchase the content; including: Taxes, Postage and packaging (if applicable), 3rd party referral fees, Refunds and payments not honoured by a financial institution, External third party costs agreed by the supplier, Payment processing, Currency exchange losses and expenses, Third party commissions (such as those taken by distribution websites or marketing affiliates). Revenues are considered as and when the funds are received by the Company, and not prior to settlement. If the Content has been resold to end users utilising an intermediary In-Platform Currency the value of Net Revenues shall be based on the number of the virtual currency spent by the end user receiving the content, multiplied by their Net Revenue (as defined above) value. On some platforms, a "free" In-Platform currency may be available; for the purposes of this agreement, the value of this currency, and the resulting purchase is nil. The creator retains the decision whether to allow their content to be made available for purchase under "free" currency. The Company will ensure the Supplier is aware of which currencies are considered "free", and which can be construed to have value. Further, it is agreed that costs, such as payment processing fees may be averaged out across all sales for all suppliers, proportionally to the total revenues for each supplier in that period. This agreement is in force until terminated by subject to termination clauses below. If the Supplier has signed a similar agreement titled "Content Agreement" in the past with the Company, this agreement supersedes, updates and replaces the prior agreement. The company shall provide the supplier with reconciliation of sales at the end of each quarter in which the supplier had sales, or within 30 days of a request from the supplier. (Not to occur more than once per 30 day period). The Company agrees to send funds to the Supplier within 30 days of the issuance of a quarterly statement to the Supplier, except when the total is less than USD $100.00, in which case the funds will accrue until such a time as they exceed USD $100.00. The Company agrees to raise self-billing invoices (or their equivalent) for the Supplier. The Supplier agrees to accept self-billed invoices raised by the Company under this agreement. The Supplier agrees to inform the Company immediately of any change to VAT registration (if applicable) or of a sale of their business, or part of their business. This agreement is in force for a period of two years from the date of signing, upon the expiry of this period, the agreement shall automatically renew for an additional two years, unless notice is given before the expiry of the agreement by either party. The Company may from time to time, request the Supplier to produce documentation, such as invoices, proof of tax status or VAT numbers, in order to process payments to the Supplier. The Company agrees to request such documentation only as is reasonable, and the Supplier commits to understanding that failure to provide such documentation may delay payments to the Supplier until such time as the documentation is provided. The relationship between the parties shall at all times be that of independent contractors. No employment, partnership or joint venture relationship is formed by this agreement and at no time may the supplier position itself as affiliated to the Company, except as an independent supplier. In view of this independent relationship the Supplier shall not enter into any agreements on behalf of the Company, shall make no warranty either expressed or implied on behalf of the Company and shall not incur any expenses on behalf of the Company. This agreement does not grant exclusive rights to the Supplier and the Supplier shall have no rights under any other agreements entered into by the Company with other Suppliers. Likewise, this agreement does not grant exclusive rights to the Company, except where otherwise agreed by both parties. The Supplier agrees not to disclose any confidential information pertaining to the Company's goods or services nor that of prospective or existing customers to any third party. This clause survives any termination of this agreement for five years from the date of termination. Either party may terminate this agreement at any time by giving the other party thirty (30) days prior written notice. Upon termination by either party all outstanding fees due to the supplier at that time shall be settled in full within thirty (30) days from the end of the following quarter. Upon termination existing content granted to users within the Platforms will remain unaffected and existing customers using the Supplier's content will be able to continue their use under the terms of the Platforms. In the event this agreement is terminated, the Company shall within a reasonable period, withdraw the Supplier's products from sale, and prevent future purchases. Items sold or transferred between two user accounts, that do not produce an additional copy of the content, shall however be allowed. The supplier specifically indemnifies the Company against all intellectual property claims (including but not limited to Copyrights, Trademarks, Patents and Trade Secrets) that may arise and warrants that all content supplied under the agreement is owned by the supplier or licensed for resale under terms that meet the terms and conditions of the Company's Platforms. The Company may choose to terminate this agreement automatically in the event that the Supplier has provided unlicensed intellectual property from third parties. The Supplier agrees to pay any and all costs incurred by the Company resulting from the inclusion of unlicensed intellectual property, including but not limited to legal fees, settlements, costs in removing the content, and refunding consumers. This agreement constitutes the whole agreement between the parties and any alteration must be in writing and signed by both parties. The parties hereby agree that this Agreement shall be construed in accordance with English Law. --- ### Content Review #### Overview[​](#overview "Direct link to Overview") When reviewing content for approval in the Space Platform ecosystem; we follow these principles and guidelines. When reviewing content for approval in the Space Platform ecosystem; we follow these principles and guidelines. Please not these are not exhaustive lists, and we follow the spirit of these rules, not letter when reviewing your content. Deliberate attempts to obfuscate or avoid these rules may result in a ban in future content uploads. ##### Account Tests[​](#account-tests "Direct link to Account Tests") * Email is verified * Curator identity information is valid * Account is in good standing ##### General Content Tests[​](#general-content-tests "Direct link to General Content Tests") ![400px-Maturityguidelines.jpg](/assets/images/400px-maturityguidelines-74fac0a5d3153868621eb32c2bb8b60b.jpg)Maturity Guidelines, areas in red should not be seen except on mature content, areas in yellow should be rarely seen (less than 25% exposed in total) * Content must work. * Content is substantially original work, and not simply a resale of assets purchased from a 3D marketplace (unless specifically authorised by the creator). * Content must not break the experience for other users. * Content is not obscene, libellous or defamatory. * Mature content is dictated by skin coverage and general societal standards. * All mature content must be tagged using the Content Rating system. * Content should not feature trademarks, copyrights, celebrities, trade dress and other IP which it is not authorised to include. Additional things we do not allow, but should not need to point out: * No content that promotes illegal activities. * Content likely to unreasonably disturb or offend the general public * No content that promotes fraud or harmful activities, including but not limited to content that may be harmful to others, their reputations, disseminating fraudulent goods, schemes or services (e.g. Ponzi and Pyramid schemes). * Offensive content (Crude humour is OK, *within reason*.) * Racist, sexist or derogatory content * Drug references * Harmful content (Viruses, content designed to trigger epilepsy, etc.) * Any content likely to cause issues with our upstream hosting providers and/or authorities. ##### Avatar Specific Content[​](#avatar-specific-content "Direct link to Avatar Specific Content") * No avatars depicting human characters under the age of 18, without a special exemption - please contact us, they will typically be granted on medical, therapeutic or training grounds. ##### Non-Region Content[​](#non-region-content "Direct link to Non-Region Content") * Content does not impose unreasonable degradation of client frame-rate. * An avatar wearing multiple items should not go above 12,000 polygons on the medium LOD. High LOD may target up to 120K. * Ideally an avatar should be closer to 8,000 polygons (or 80,000 in High-LOD). This should be split based on the proportion of body covered. (e.g. a Jacket which covers 50% of the mesh should be between 4,000 and 6,000 polygons. Shoes which cover 15% should be 1,200.) * Clothing content should use the minimum materials possible. While multiple materials is sometimes required for fancy effects, in most cases it is not; and you can bake or atlas your textures. (This often comes from content built in Marvelous Designer and uploaded directly without UV mapping and retexturing but using multiple materials.) * Content filesize is reasonable for the scale and complexity of the content. * Clothing content should typically be around 1-2mb after compression. ##### Scripted Content[​](#scripted-content "Direct link to Scripted Content") * Content does not place a undue strain on viewers or servers * Content does not disrupt the core user interface in such a way that the average user cannot cancel or return ##### Region Content[​](#region-content "Direct link to Region Content") * Private regions which are marked not-for-sale are subject to minimal screening (account and general content tests only) * Regions marked for-sale (available to purchase in the shop) are subject to complexity limits similar to non-region content. Typically we'd like to see 30fps on a mid-spec desktop viewer as a minimum with one avatar in the region. Use of Occlusion Culling, and LOD Groups can significantly improve performance of a region. ##### Exceptions[​](#exceptions "Direct link to Exceptions") * Exceptions will be made for particularly impressive content. * If your content is well-made, but comes in slightly heavier than our typical allowances, we will approve the content. * For example: if you have used normal maps or DX11 Tessellation, and still need a few more polygons - and we can recognise that the content simply requires this; we will approve the exception. * This is the exceptions, not the rule. Generally we will enforce the above limits. ##### How we test[​](#how-we-test "Direct link to How we test") * We will examine the uploaded content as-supplied to our processing server * Our tests may cover multiple platforms (typically Standalone, WebGL and one mobile target), we expect to see graceful fallbacks in content available for general use. * Content will be benchmarked using our special benchmark setup (this typically involves loading 100 copies of the content into a region, and measuring performance impact) ##### Appealing a review[​](#appealing-a-review "Direct link to Appealing a review") * If your content was rejected and you feel this review was unfair, please open a support ticket with the 'Regarding' as 'Creator Program', and include your curator account name, and the item ID for the affected item. --- ## Quickstart Sinespace Viewer ### Quickstart #### [πŸ“„οΈGet Started: SDK](/quickstart-sinespace-viewer/get-started-sdk/sdk-setup.md) [Install a compatible Unity version, import the Sinespace Editor Pack, configure editor settings, and sign in as a creator.](/quickstart-sinespace-viewer/get-started-sdk/sdk-setup.md) --- ### SDK Setup #### Overview[​](#overview "Direct link to Overview") To install our SDK you will need a compatible version of Unity. After Unity is installed, download and import the Sinespace Editor Pack, install the editor pack settings, and sign in with a creator account. #### Install a compatible version of Unity[​](#install-a-compatible-version-of-unity "Direct link to Install a compatible version of Unity") To install our SDK you will need a compatible version of Unity, this can be obtained from . After download a base install of Unity will be fine, no special features are required. warning For production use we recommend 2018.4 or 2017.4 current releases. #### Download the Sinespace Editor Pack[​](#download-the-sinespace-editor-pack "Direct link to Download the Sinespace Editor Pack") From inside a fresh Unity project click on the asset store tab, type Sinespace into the store search box and click on the Sinespace image. In the new window that appears click the blue download icon to start the download. ![Asset store Sinespace SDK download](/assets/images/sdk_install_1-3a3fccdedc97ad95e8685e30e2621905.png) #### Install the Sinespace Editor Pack[​](#install-the-sinespace-editor-pack "Direct link to Install the Sinespace Editor Pack") When the download is completed the download button will change to a blue import button, click the import button to start the install. On the window that appears in the top left click import again, you do not need to deselect any of the packages in this window as our installer will determine the correct Editor Pack install. ![Editor Pack Install](/assets/images/sdk_install_2-41525e13a969c9fb8e5c3e5abc1f9e03.png) The install will now begin, Unity may ask to restart during the installation this is normal and you can proceed by clicking the restart button. The next window to be displayed are the assets that are included with our Editor Pack, click the import button once again to continue the install. ![Editor Pack Assets](/assets/images/sdk_install_3-3eaa1dc01f242b63cb2e6c97609f9c0c.png) Now that the install is completed you will notice two new folders in your assets named Sinespace and Spacepack, you will also see a new drop down menu called Sinespace. To complete the install you will need to select the Sinespace dropdown and click on install editor pack settings, this will install the graphical settings required by our editor pack. ![Install Editor pack Settings](/assets/images/sdk_install_4-1bcc3ca25fe5d08061750e9a611d1a70.png) warning Mac users will need to install our native Mac uploader, in the Sinespace drop down menu select tools/install/Native Mac uploader. #### Sign in to the Editor Pack[​](#sign-in-to-the-editor-pack "Direct link to Sign in to the Editor Pack") In the Sinespace drop down menu select sign in, in the inspector on the right you will see a login panel, if you have previously signed up as a creator you can sign in using your username and password to complete the install. info Signing up for a creator account instructions below. ![Editor Pack sign in](/assets/images/sdk_install_5-126b8d9797519178048fe47939565acd.png) #### Signing up for a creator account[​](#signing-up-for-a-creator-account "Direct link to Signing up for a creator account") * Editor Pack sign up * Website sign up #### Creator sign up in the Editor Pack[​](#creator-sign-up-in-the-editor-pack "Direct link to Creator sign up in the Editor Pack") In the Sinespace drop down menu select sign in, in the inspector located on the right click the create account button. ![Sign up for a creator account](/assets/images/sdk_install_6-ae76da62a86b251c7fc109435b069f34.png) In the window that appears select a desired username, enter your email address and select male or female starter avatar, continue to fill out the form these details are not shared publicly. Once completed you can return to Unity and enter your username and password to start creating. Creator sign up via the the website If you already have an account with Sinespace you can sign up for creator access by visiting [https://curator.sine.space/login](https://curator.sine.space/), in the page displayed enter you username and password and click sign in. Once signed in you will be shown our End-User License Agreement, read through and at the bottom of the page click the I Accept button. Finally to complete the sign up process click on the settings button and fill in your creator details, these are not shared publicly. ![Editor pack sign up](/assets/images/sdk_install_7-fa3918fd7fc334f1ab61ebff2e2c9ea1.png) You can now return to Unity and enter your username and password to start creating. #### --- ### Get Started - Viewer #### Overview[​](#overview "Direct link to Overview") The Sinespace viewer is needed to get into the Sinespace virtual world. The Sinespace viewer is needed to get into the Sinespace virtual world. Our viewer runs on Windows, Mac, Linux, VR, iOS and Android. For system requirements and how to install see: * [System Requirements](/quickstart-sinespace-viewer/get-started-viewer/system-requirements.md) * [Viewer Setup](/quickstart-sinespace-viewer/get-started-viewer/viewer-setup.md) Once you have downloaded and installed the viewer, you can choose to either log into to live or preview. Logging into the live server will log you into our public server which all of our users use. The preview server is used by creators to review their items before pushing them to the live server. ##### Logging into Live[​](#logging-into-live "Direct link to Logging into Live") To log in to our live server, all you need is the username and password you created on sign up through our website. You can also register for an account through the log in screen of the viewer, login as Guest or click on the 'Lost Password' button to reset your password. You can choose whether to log into the default region which is our Welcome Centre, Home region or the last visited region under the 'Arrive At' drop-down. ![An overview of the login](/assets/images/Login_Live-68ecad48c1933ab79f16615a14a7134d.jpg) ##### Logging into Preview[​](#logging-into-preview "Direct link to Logging into Preview") To log into preview, you will need the username and password you created when signing up to Sinespace, and you will also need to have accepted our EULA terms on Curator. This is needed to be able to review your items on the viewer as a creator. Please make sure to check the ’Preview’ box to log into preview. ![](/assets/images/login_preview-4a1cd94aa710b3476e21c4ac5cfcab4e.jpg) You're all set up to check out Sinespace! To learn the basics of our viewer see: [Viewer Basics](/sinespace-viewer/viewer-basics.md) --- ### For Linux Users #### Overview[​](#overview "Direct link to Overview") Installing and Using the Sinespace Client - Download the Linux Client. #### Installing and Using the Sinespace Client[​](#installing-and-using-the-sinespace-client "Direct link to Installing and Using the Sinespace Client") * [Download the Linux Client](https://sine.space/download/). * Unpack the client. * From inside the client directory, run **sudo ./install.sh** to install. Depending on your desktop file manager, you may also try right-clicking this file and running it as root/admin. * Run **sinespace** to launch the client. The Sinespace client is officially only supported on [Ubuntu Linux](http://ubuntu.com). Unofficially, other conventional Linux distributions should be able to run the client without additional work. For full media support, you may need to install the **libavcodec** and **libswscale** libraries. This task is already taken care of by the **install.sh** script for Ubuntu users. #### Obtaining the Unity Editor[​](#obtaining-the-unity-editor "Direct link to Obtaining the Unity Editor") The Unity Editor for Linux is currently in beta. It is supported on [Ubuntu Linux](http://ubuntu.org). As it is currently in beta, it is not officially supported by Sinespace but still may be useful to developers. [The Unity on Linux Thread](https://forum.unity.com/threads/unity-on-linux-release-notes-and-known-issues.350256/) contains links to download the editor, release notes and a list of known issues. The same thread also contains a list of dependencies that may be used to unofficially run the editor on other Linux distributions. In addition to its requirements, the Sinespace SDK needs the **mono-complete** package also installed: **sudo apt install mono-complete** Installation from the command-line is done in two steps: * Download the Unity .deb archive, in this example: unity-editor\_amd64-2017.2.1f1.deb * Install the .deb archive with **sudo apt install ./unity-editor\_amd64-2017.2.1f1.deb** --- ### System Requirements #### Overview[​](#overview "Direct link to Overview") Desktop system requirements Low spec: 0-50 avatars in a space, simple scenes. #### Desktop system requirements[​](#desktop-system-requirements "Direct link to Desktop system requirements") ##### Low spec: 0-50 avatars in a space, simple scenes.[​](#low-spec-0-50-avatars-in-a-space-simple-scenes "Direct link to Low spec: 0-50 avatars in a space, simple scenes.") Minimum specifications: * Operating System: 64-bit Windows 10 or MacOS 10.92 (Linux available but unsupported). * Memory (RAM): 8GB or more. * Storage: 4GB available space (2GB installed size, 2GB cache). * CPU/GPU: * Intel: Intel i3 at 2Ghz+, with Intel UHD Graphics 620. * AMD: AMD Athlon 3050U with Radeon Graphics, or better. * DirectX: Version 10. * Network: Broadband internet connection. * Additional: Microphone required for voice chat. ![]() warning Please note that these specifications assume that Sinespace's graphic settings have been customized to the lowest available option ("Fastest," with the detail slider dragged to the far left, as pictured above). These recommendations also assume that the system is in good condition, with minimal background activity while using the application. ##### Medium spec: 50-100 avatars in a space, medium to complex scenes.[​](#medium-spec-50-100-avatars-in-a-space-medium-to-complex-scenes "Direct link to Medium spec: 50-100 avatars in a space, medium to complex scenes.") Medium specifications: * Operating System: 64-bit Windows 10 or MacOS 10.92 (Linux available but unsupported). * Memory (RAM): 16GB or more. * Storage: 4GB available space (2GB installed size, 2GB cache). * CPU/GPU: * Quad core or better Intel i5, or AMD equivalent. * Discrete non-integrated GPU (may work with higher end integrated GPUs, such as AMD Radeon APUs). * DirectX: Version 10. * Network: Broadband internet connection. * Additional: Microphone required for voice chat. ##### High spec: 200+ avatars in a space, complex scenes.[​](#high-spec-200-avatars-in-a-space-complex-scenes "Direct link to High spec: 200+ avatars in a space, complex scenes.") High specifications: * Operating System: 64-bit Windows 10 or MacOS 10.92 (Linux available but unsupported). * Memory (RAM): 32GB or more. * Storage: 4GB available space (2GB installed size, 2GB cache). * CPU/GPU: * Quad core or better Intel i5, or AMD equivalent. * Discrete GPU, nVidia GeForce 1050M or better. (GeForce 1650 recommended.) * If using VR, an NVIDIA GeForce GTX 1080 Ti or better is recommended. (See below.) * DirectX: Version 10. * Network: Broadband internet connection. * Additional: Microphone required for voice chat. warning Some features may not work in MacOS clients older than OSX 10.11. We recommend updating to 10.12 or 10.13 if possible. #### VR system requirements[​](#vr-system-requirements "Direct link to VR system requirements") For users accessing Sinespace via VR-capable viewers, the following hardware is recommended. * Operating System: 64-bit Windows 10, MacOS 10.92, or Steam OS (Linux available but unsupported). * Memory (RAM): 16GB or more. * Storage: 4GB available space (2GB installed size, 2GB cache). * CPU/GPU: * Intel i5-4590, AMD FX 8350 equivalent or better. * NVIDIA GeForce GTX 1080 Ti or better. * Software: Requires SteamVR (Windows, Mac, Linux) or Oculus (Windows). * VR Headset: Quest 1 or 2 strongly recommended. Support for Vive, Rift/Rift S. warning STRONG DISCLAIMER: Your VR experience will be heavily affected by the region or event in which you are located. #### Unity and Sinespace SDK requirements[​](#unity-and-sinespace-sdk-requirements "Direct link to Unity and Sinespace SDK requirements") **Minimum:** * Unity version: 2018.4.35 or better. * Sinespace SDK: Available through the [Unity Asset Store](https://assetstore.unity.com/packages/tools/game-toolkits/sinespace-virtual-world-137731). See [SDK Setup](/quickstart-sinespace-viewer/get-started-sdk/sdk-setup.md) for installation steps. --- ### Viewer Installation #### Overview[​](#overview "Direct link to Overview") After downloading the viewer installer for your respective OS, you will need to install it. warning For Vista and Windows 7 please install [Microsoft .NET 4.5.1](https://www.microsoft.com/en-au/download/details.aspx?id=40773) first. After [downloading the viewer](https://sine.space/download/) installer for your respective OS, you will need to install it. ##### Windows Viewer Installation[​](#windows-viewer-installation "Direct link to Windows Viewer Installation") 1. Find the Sinespace\_Windows\_Installer.exe in your Downloads folder. 2. Click on it to start the installation process. 3. On the Setup Wizard, click Next. 4. Review and accept the License Agreement. 5. Choose an Installation Directory. 6. Choose a build - we recommend choosing the release build as this is the most stable. Preview builds are for creators and testers only; please report any bugs you find in the preview builds to our [bug tracker.](https://issues.sine.space/login_page.php) 7. Choose if you want to create shortcuts. 8. The Wizard will now download and install the viewer. This may take a few minutes depending on your internet speed. 9. When it's completed it will ask you to Launch Sinespace; you can launch Sinespace at a later date from the installation directory if you don't want to launch it right away. ##### Mac Viewer Installation[​](#mac-viewer-installation "Direct link to Mac Viewer Installation") 1. Find the Sinespace\_Windows\_Installer.exe in your Downloads folder. 2. Click on it to start the installation process. 3. On the Setup Wizard, click Next. 4. Review and accept the License Agreement. 5. Choose an Installation Directory. 6. Choose a build - we recommend choosing the release build as this is the most stable. Preview builds are for creators and testers only; please report any bugs you find in the preview builds to our [bug tracker.](https://issues.sine.space/login_page.php) 7. Choose if you want to create shortcuts. 8. The Wizard will now download and install the viewer. This may take a few minutes depending on your internet speed. 9. When it's completed it will ask you to Launch Sinespace; you can launch Sinespace at a later date from the installation directory if you don't want to launch it right away. ##### Linux Viewer Installation[​](#linux-viewer-installation "Direct link to Linux Viewer Installation") 1. Unpack the viewer. 2. From inside the viewer directory, run **sudo ./install.sh** to install. Depending on your desktop file manager, you may also try right-clicking this file and running it as root/admin. 3. Run **sinespace** to launch the viewer. --- ## Scripting ### Welcome to Scripting API **This documentation is in progress. Please visit** [**this page**](/scripting/support/report-an-issue.md) **to report any issues, missing information, corrections or suggestions you may have.** #### **Introduction**[​](#introduction "Direct link to introduction") Scripting in Sinespace uses the **Lua programming language**. Sinespace offers scripters **Unity components,** which are added to GameObjects, that will run the scripts(code) that we write inside them. These Unity components come within the **Sinespace Editor Pack** package, which needs to be installed in our Unity project before we begin scripting. Our core class is the [SScript](/scripting/client-scripting-api-reference/region/sscript.md) class, which is accessed by writing "Space". Example: `Space.Log('Hello World')` is equivalent to [SScript.Log('Hello world')](/scripting/client-scripting-api-reference/region/sscript.md#log). All of your functions/properties will be accessed starting with 'Space' which also navigates to other classes. There's very few exceptions that are accessed directly such as "Math" ([SMath](/scripting/server-scripting-api-reference/library/smath.md)) and "Color"([SColor](/scripting/client-scripting-api-reference/types/scolor.md)). Example: `Space.Network.SendNetworkMessage()` this starts with the [SScript](/scripting/client-scripting-api-reference/region/sscript.md) class and goes into the [SNetwork](/scripting/client-scripting-api-reference/network/snetwork.md) class. ##### Client Scripts vs Server Scripts[​](#client-scripts-vs-server-scripts "Direct link to Client Scripts vs Server Scripts") Client scripts run client-side, and Server scripts run server-side. Browsing the left panel of this documentation you will find that our API Reference is split into two different parts - Client Scripting and Server Scripting. ##### **Your first Client Script**[​](#your-first-client-script "Direct link to your-first-client-script") To begin creating your first Sinespace Client Script, make sure you have the Sinespace Editor Pack properly installed, and then: * Select your GameObject * Click **Add Component** * Search for and select **Scripting Runtime** * Enter your code in the **Script Contents** text box - for example `Space.Log('Hello World!')` * Press **Play Scene** (you should see your "Hello World!" in the Unity console window) ##### Your first Server Script[​](#your-first-server-script "Direct link to Your first Server Script") It's recommended that new scripters familiarize themselves with Client scripts first before jumping into Server scripts, or creating more complicated objects that require server scripts. Visit the [Server Scripts guide](/scripting/guides/server-scripts.md) to begin your first Server script. --- ### Changelog #### [πŸ“„οΈAPI Changelog](/scripting/changelog/api-changelog.md) [A list of changes to the Sinespace API](/scripting/changelog/api-changelog.md) --- ### API Changelog | Date | Change | Version | | ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------- | | 20 December 2022 | SClickable.InvokeClick added
SGrid.ID added (white-label only) | 2022.1f16419 (Current Live Release) | | 26 August 2022 | [SScript.ComponentName](../client-scripting-api-reference/region/sscript#componentname) added
[SStateMachine.ComponentName](../client-scripting-api-reference/components/sstatemachine#componentname) added
[SScriptingRuntime.ComponentName](../client-scripting-api-reference/components/sscriptingruntime#componentname) added[SScriptingEvents.ComponentName](../client-scripting-api-reference/components/sscriptingevents#componentname) added
[SScriptingData.ComponentName](../client-scripting-api-reference/components/sscriptingdata#componentname) added | 15969 | | 26 August 2022 | [SNavMeshAgent.Warp](../client-scripting-api-reference/components/snavmeshagent#warp) added | 15967 | | 17 August 2022 | \*Network Messages can now be sent 20 times per second (up from 10) | 15912 | | 17 August 2022 | [SNetwork.SendNetworkMessageToUser ](../client-scripting-api-reference/network/snetwork#sendnetworkmessagetouser)added
[SNetwork.SubscribeToRegionPropertyUpdate](../client-scripting-api-reference/network/snetwork#subscribetoregionpropertyupdate) added | 15910 | | 11 August 2022 | [SAvatar.OnAvatarAttached](../client-scripting-api-reference/types/savatar#onavatarattached) added
[SAvatar.OnAvatarDetached](../client-scripting-api-reference/types/savatar#onavatardetached) added | 15867 | | 20 May 2022 | [SUI.OpenFeedbackWindow](../client-scripting-api-reference/client/sui#openfeedbackwindow) added (white-label)
[SUI.HideFeedbackWindow](../client-scripting-api-reference/client/sui#hidefeedbackwindow) added (white-label) | 15375 | | 18 May 2022 | [SRenderSettings.SetGlobalShaderVector](../client-scripting-api-reference/region/srendersettings#setglobalshadervector) Added an additional parameter to the function, which will count as the 4th component of a Vector4. (Incase we wanted to pass a Vector4 instead of Vector3). | 15369 | | 17 May 2022 | [SUIDropdown.SetValueByText](../client-scripting-api-reference/components/suidropdown#setvaluebytext) added | 15362 | | 29 Apr 2022 | [SDateTime](../client-scripting-api-reference/types/sdatetime) expanded with Year, Month, Day, Hour, Minute, Second, Millisecond properties | 15303 | | 27 Apr 2022 | [SGrid.ThemeColor1](../client-scripting-api-reference/region/sgrid#themecolor1) added
[SGrid.ThemeColor2](../client-scripting-api-reference/region/sgrid#themecolor2) added
[SGrid.ThemeColor3](../client-scripting-api-reference/region/sgrid#themecolor3) added
[SGrid.ThemeColor4](../client-scripting-api-reference/region/sgrid#themecolor4) added
[SGrid.TextColor1](../client-scripting-api-reference/region/sgrid#textcolor1) added
[SGrid.TextColor2](../client-scripting-api-reference/region/sgrid#textcolor2) added | 15300 | | 25 Mar 2022 | [SScene.Population](../client-scripting-api-reference/region/sscene#population) added | 15151 | | 8 Mar 2022 | [SDateTime](../client-scripting-api-reference/types/sdatetime) added | 15057 | | 20 Dec 2021 | [SAnimator.PlaybackTime](../client-scripting-api-reference/components/sanimator#playbacktime) added | 14426 | | 16 Dec 2021 | [SAvatar.DisplayName](../client-scripting-api-reference/types/savatar#displayname) added | 14405 | | 8 Dec 2021 | [SRoomFloor.Owner](../client-scripting-api-reference/components/sroomfloor#owner) added
[SFurniture.Floor](../client-scripting-api-reference/components/sfurniture#floor) added | 14331 | | 2 Dec 2021 | [SLineRenderer.SetPosition](../client-scripting-api-reference/components/slinerenderer#setposition)/[GetPosition](../client-scripting-api-reference/components/slinerenderer#getposition) are now 0-index | 14276 | | 24 Nov 2021 | [SGameObject.Moniker](../client-scripting-api-reference/types/sgameobject#moniker) added | 14193 | | 16 Nov 2021 | [SAvatar.PlayCustomAnimation](../client-scripting-api-reference/types/savatar#playcustomanimation) no longer blocks avatar from moving | 14144 | --- ### Client Scripting API #### [πŸ—ƒClient](/scripting/client-scripting-api-reference/client.md) [4 items](/scripting/client-scripting-api-reference/client.md) --- ### Client The client runtime surface β€” entry points for on-screen dialogues, player input, shared data, and the in-world UI that client scripts can drive. --- ### SDialogues #### Index[​](#index "Direct link to Index") | Function Name | | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | void [**ColorPicker**](sdialogues#colorpicker) (string title, string okbutton, Action< SColor > onChange, Action< SColor > onSelect, Action onCancel, SColor defaultColor) | | void [**YesNoInput** ](sdialogues#yesnoinput)(string title, string okbutton, string cancelButton, Action< bool > result) | | void [**TextInput** ](sdialogues#textinput)(string title, string okButton, Action< string > result) | | void [**OpenURL** ](sdialogues#openurl)(string url, bool newTab = true) | | void [**SendLocalChat** ](sdialogues#sendlocalchat)(string message, string from) | #### Functions[​](#functions "Direct link to Functions") ##### **ColorPicker**[​](#colorpicker "Direct link to colorpicker") *Opens a color picker dialogue.* void **ColorPicker**(string title, string okbutton, Action< SColor > onChange, Action< SColor > onSelect, Action onCancel, SColor defaultColor) | Parameter | Type | Description | | ------------ | ---------------------------- | -------------------------------------------------------------------------------------------------------- | | title | string | The title of the color picker window. Choose something brief and appropriate like 'Select a wall color'. | | okbutton | string | The title of the 'OK' button. Should indicate the action e.g. 'Adjust Wall'. | | onChange | Action\\\ or Closure | Any color change while the color picker is open will trigger onChange(SColor). | | onSelect | Action\\\ or Closure | Triggers onSelect(SColor) once the "ok" button is pressed. | | onCancel | Action\\\ or Closure | The title of the 'OK' button. Should indicate the action e.g. 'Adjust Wall'. | | defaultColor | SColor | The color to open the colour picker with. | * Lua ```lua --clicking the object will open a color picker that changes the object's color thisGameObject = Space.Host.ExecutingObject originalColor = thisGameObject.Renderer.Material.GetColor("_Color") OnChange = function(SColor) thisGameObject.Renderer.Material.SetColor("_Color",SColor) end OnSelect = function(SColor) thisGameObject.Renderer.Material.SetColor("_Color",SColor) end OnCancel = function() thisGameObject.Renderer.Material.SetColor("_Color",originalColor) end OnClick = function() Space.Dialogues.ColorPicker("title","okbutton", OnChange, OnSelect, OnCancel, originalColor) end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### **YesNoInput**[​](#yesnoinput "Direct link to yesnoinput") *Opens a simple Yes/No dialogue**.*** void **YesNoInput**(string title, string okbutton, string cancelButton, Action< bool > result) | Parameter | Type | Description | | ------------ | --------------- | --------------------------------------------------------------------------------------------- | | title | string | The question to be asked of the user. Should be a simple statement, e.g. "Save room changes?" | | okbutton | string | The text on the OK button, should indicate the action, e.g. "Save Room" | | cancelButton | string | The text on the cancel button, should indicate the action, e.g. "Not now" | | result | Action\\\ | Will fire a callback event depending on the status of the users actions | * Lua ```lua hostObject = Space.Host.ExecutingObject local deltaPos = Vector.New(0,100,0) local teleportTo = hostObject.WorldPosition + deltaPos function teleportMeUp (b) if b then Space.Scene.PlayerAvatar.Teleport(teleportTo) end end function openDialogue () Space.Dialogues.YesNoInput ("Ready for a teleport?", "Yes", "No", teleportMeUp) end hostObject.SubscribeToEvents() hostObject.OnMouseDown(openDialogue) ``` ##### TextInput[​](#textinput "Direct link to TextInput") *Opens a text entry window with room for a single multi-line text field.* void **TextInput** ( string title, string okButton, Action< string > result) | Parameter | Type | Description | | --------- | ---------------- | ----------------------------------------------------------------------------------- | | title | string | The accompanying text. Should be something ala "Enter your username". | | okButton | string | The text displayed on the OK button, should be descriptive, e.g. "Change Username". | | result | Action< string > | Triggers result(string) once the "Ok" button is pressed. | * Lua ```lua hostObject = Space.Host.ExecutingObject printToLog = function (s) Space.Log(s) end function openDialogue () Space.Dialogues.TextInput ("Write anything.", "Done", printToLog) end hostObject.OnMouseDown(openDialogue) ``` ##### OpenURL[​](#openurl "Direct link to OpenURL") *Opens the specified URL in the in-app web browser, or the system web browser. In some environments the user may be prompted before this is opened.* void **OpenURL** ( string url, bool newTab = true ) | Parameter | Type | Description | | --------- | ------ | --------------------------------------- | | url | string | The web address to open. | | newTab | bool | Does the URL open in a new browser tab? | * Lua ```lua -- when the object is clicked, the "sine.space" website is opened hostObject = Space.Host.ExecutingObject function openTheWebsite () Space.Dialogues.OpenURL("http://sine.space/") end hostObject.OnMouseDown(openTheWebsite) ``` ##### SendLocalChat[​](#sendlocalchat "Direct link to SendLocalChat") *Sends a message into the 'Script' chat channel.* void **SendLocalChat** ( string message, string from ) | Parameter | Type | Description | | --------- | ------ | ------------------------------------- | | message | string | The message to appear in the channel. | | from | string | The 'from' username for the message. | * Lua ```lua hostObject = Space.Host.ExecutingObject function chatMessage () Space.Dialogues.SendLocalChat ("I've been clicked", "Clickable Object") end hostObject.OnMouseDown(chatMessage) ``` --- ### SInput #### Functions[​](#functions "Direct link to Functions") ##### **GetKeyDown**[​](#getkeydown "Direct link to getkeydown") bool **GetKeyDown** (string key) *Returns true if 'key' was pressed during this frame.* | Parameter | Type | Description | | --------- | ------ | -------------------------------------------------------------------------------------------- | | key | string | [Input key name](/scripting/client-scripting-api-reference/client/sinput.md#input-key-names) | * Lua ```lua thisGameObject = Space.Host.ExecutingObject OnUpdate = function() if Space.Input.GetKeyDown("space") then Space.Log("Jump Key Down") end end thisGameObject.OnUpdate(OnUpdate) ``` ##### **GetKeyUp**[​](#getkeyup "Direct link to getkeyup") bool **GetKeyUp** (string key) *Returns true if 'key' is no longer pressed during this frame (but was in the last).* | Parameter | Type | Description | | --------- | ------ | -------------------------------------------------------------------------------------------- | | key | string | [Input key name](/scripting/client-scripting-api-reference/client/sinput.md#input-key-names) | * Lua ```lua thisGameObject = Space.Host.ExecutingObject OnUpdate = function() if Space.Input.GetKeyUp("space") then Space.Log("Jump Key Released") end end thisGameObject.OnUpdate(OnUpdate) ``` ##### **GetKey**[​](#getkey "Direct link to getkey") bool **GetKey** (string key) *Returns true if 'key' is being held pressed.* | Parameter | Type | Description | | --------- | ---- | -------------------------------------------------------------------------------------------- | | key | bool | [Input key name](/scripting/client-scripting-api-reference/client/sinput.md#input-key-names) | * Lua ```lua thisGameObject = Space.Host.ExecutingObject OnUpdate = function() if Space.Input.GetKey("space") then Space.Log("Jump Key Held") end end thisGameObject.OnUpdate(OnUpdate) ``` ##### GetMouseDown[​](#getmousedown "Direct link to GetMouseDown") bool **GetMouseDown** (int button) *Returns true if mouse 'button' was pressed during this frame.* | Parameter | Type | Description | | --------- | ---- | -------------------------------------------------------------------------------------------------------------------------- | | button | int | *button* values are 0 for the primary button (often the left button), 1 for secondary button, and 2 for the middle button. | * Lua ```lua if Space.Input.GetMouseDown(1) then Space.Log("Right Mouse button pressed in this frame") end ``` * Lua ```lua --this script will make this object jump to wherever you right click thisGameObject = Space.Host.ExecutingObject OnUpdate = function() if Space.Input.GetMouseDown(1) then clickRay = Space.Camera.ScreenCoordinatesToRay(Space.Input.MousePosition) rayCastHit = Space.Physics.RayCastSingle(clickRay.Origin, clickRay.Direction, 50.0) thisGameObject.WorldPosition = rayCastHit.Position end end thisGameObject.OnUpdate(OnUpdate) ``` ##### GetMouseUp[​](#getmouseup "Direct link to GetMouseUp") bool **GetMouseUp** (int button) *Returns true if mouse 'button' is no longer pressed during this frame (but was in the last).* | Parameter | Type | Description | | --------- | ---- | -------------------------------------------------------------------------------------------------------------------------- | | button | int | *button* values are 0 for the primary button (often the left button), 1 for secondary button, and 2 for the middle button. | * Lua ```lua if Space.Input.GetMouseUp(1) then Space.Log("Right Mouse button was just unpressed") end ``` ##### GetMouseHold[​](#getmousehold "Direct link to GetMouseHold") bool **GetMouseHold** (int button) *Returns true if mouse 'button' is being held pressed.* | Parameter | Type | Description | | --------- | ---- | -------------------------------------------------------------------------------------------------------------------------- | | button | int | *button* values are 0 for the primary button (often the left button), 1 for secondary button, and 2 for the middle button. | * Lua ```lua if Space.Input.GetMouseHold(1) then Space.Log("Right Mouse button being held") end ``` * Lua ```lua --this script will make this object will follow your ovement while holding right click thisGameObject = Space.Host.ExecutingObject OnUpdate = function() if Space.Input.GetMouseHold(1) then clickRay = Space.Camera.ScreenCoordinatesToRay(Space.Input.MousePosition) rayCastHit = Space.Physics.RayCastSingle(clickRay.Origin, clickRay.Direction, 50.0) thisGameObject.WorldPosition = rayCastHit.Position end end thisGameObject.OnUpdate(OnUpdate) ``` ##### Vibrate[​](#vibrate "Direct link to Vibrate") void **Vibrate** (float intensity, float duration, bool leftHand) *Vibrates the controller (or phone, or gamepad) if a rumble device is present.* | Parameter | Type | Description | | --------- | ----- | ------------------------------------------------------------------------------------------------ | | intensity | float | Intensity of the vibration from 0.0 to 1.0 | | duration | float | Duration of the vibration. Maximum 1.0 second. | | leftHand | bool | If true the vibration will be on the left hand and if false on the right hand (where applicable) | * Lua ```lua Space.Input.Vibrate(1,1,false) ``` #### Properties[​](#properties "Direct link to Properties") ##### **ScrollWheel**[​](#scrollwheel "Direct link to scrollwheel") float **ScrollWheel** `get` *Returns a non-0 value if the mouse wheel is being scrolled, value usually ranges from -1 to 1\*\*.\*\** * Lua ```lua scrollWheel = Space.Input.ScrollWheel ``` * Lua ```lua --Object will move up and down with scroll wheel movement thisGameObject = Space.Host.ExecutingObject OnUpdate = function() thisGameObject.WorldPosition = thisGameObject.WorldPosition + (thisGameObject.Up * Space.Input.ScrollWheel) end thisGameObject.OnUpdate(OnUpdate) ``` ##### MousePosition[​](#mouseposition "Direct link to MousePosition") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **MousePosition** `get` *Returns the current position of the mouse in screen pixels. If on a touch screen device, this will also return the location of the first finger being pressed.* * Lua ```lua currentMousePos = Space.Input.MousePosition ``` * Lua ```lua --Object will follow your mouse movement while holding right click thisGameObject = Space.Host.ExecutingObject OnUpdate = function() if Space.Input.GetMouseHold(1) then clickRay = Space.Camera.ScreenCoordinatesToRay(Space.Input.MousePosition) rayCastHit = Space.Physics.RayCastSingle(clickRay.Origin, clickRay.Direction, 50.0) thisGameObject.WorldPosition = rayCastHit.Position end end thisGameObject.OnUpdate(OnUpdate) ``` ##### MovementAxis[​](#movementaxis "Direct link to MovementAxis") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **MovementAxis** `get` *Returns left/right (A/D) movement on X, forward/back (W/S) on Y, and up/down (E/C) on Z.* * Lua ```lua moveAxis = Space.Input.MovementAxis ``` * Lua ```lua --Object moves according to your AWSD presses thisGameObject = Space.Host.ExecutingObject OnUpdate = function() if Space.Input.MovementAxis.Y > 0 then thisGameObject.WorldPosition = thisGameObject.WorldPosition + thisGameObject.Forward elseif Space.Input.MovementAxis.Y < 0 then thisGameObject.WorldPosition = thisGameObject.WorldPosition - thisGameObject.Forward end if Space.Input.MovementAxis.X > 0 then thisGameObject.WorldPosition = thisGameObject.WorldPosition + thisGameObject.Right elseif Space.Input.MovementAxis.X < 0 then thisGameObject.WorldPosition = thisGameObject.WorldPosition - thisGameObject.Right end end thisGameObject.OnUpdate(OnUpdate) ``` ##### TurnAxis[​](#turnaxis "Direct link to TurnAxis") [SVector](/scripting/client-scripting-api-reference/types/svector.md)? **TurnAxis** `get` Returns the Turn Axis (-1 to 1 on Vector's X value). * Lua ```lua turnAxis = Space.Input.TurnAxis ``` * Lua ```lua --makes this object color red if player is turning left --and color green if player is turning right --and blue if player is not turning thisGameObject = Space.Host.ExecutingObject OnUpdate = function() if Space.Input.TurnAxis.X > 0 then thisGameObject.Renderer.Material.SetColor("_Color",Color.Red) elseif Space.Input.TurnAxis.X < 0 then thisGameObject.Renderer.Material.SetColor("_Color",Color.Green) elseif Space.Input.TurnAxis.X == 0 then thisGameObject.Renderer.Material.SetColor("_Color",Color.Blue) end end thisGameObject.OnUpdate(OnUpdate) ``` *** ##### MouseLook[​](#mouselook "Direct link to MouseLook") bool **MouseLook** `get` `set` Enable or disable Mouse Look feature. * Lua ```lua Space.Input.MouseLook = true ``` * Lua ```lua --the below script will put your player into MouseLook mode if you are near the object --and return you to normal mode if you are far from the object thisGameObject = Space.Host.ExecutingObject function OnUpdate() positionAvatar = Space.Scene.PlayerAvatar.GameObject.WorldPosition positionObject = thisGameObject.WorldPosition if positionAvatar.InRange(positionObject, 5.0) then if Space.Input.MouseLook == false then Space.Input.MouseLook = true end else if Space.Input.MouseLook == true then Space.Input.MouseLook = false end end end thisGameObject.OnUpdate(OnUpdate) ``` ##### MouseX[​](#mousex "Direct link to MouseX") float **MouseX** `get` *Returns a float representing the Mouse/Right Joystick horizontal movement. If the value is positive the movement is upwards. If the value is negative the movement is downwards. The value is derived by multiplying mouse delta with axis sensitivity. This is frame-rate independent; you do not need to be concerned about varying frame-rates when using this value.* * Lua ```lua MouseX = Space.Input.MouseX ``` * Lua ```lua --the below script will rotate this object along the Y axis --according to your mouse/right joystick horizontal movement thisGameObject = Space.Host.ExecutingObject function OnUpdate() currentY = thisGameObject.WorldRotation.EulerAngles.Y newY = currentY + Space.Input.MouseX thisGameObject.WorldRotation = Quaternion.Euler(0, newY, 0) end thisGameObject.OnUpdate(OnUpdate) ``` ##### MouseY[​](#mousey "Direct link to MouseY") float **MouseY** `get` *Returns a float representing the Mouse/Right Joystick vertical movement. If the value is positive the movement is to the right. If the value is negative the movement is to the left. The value is derived by multiplying mouse delta with axis sensitivity. This is frame-rate independent; you do not need to be concerned about varying frame-rates when using this value.* * Lua ```lua MouseY = Space.Input.MouseY ``` * Lua ```lua --the below script will rotate this object along the Y axis --according to your mouse/right joystick vertical movement thisGameObject = Space.Host.ExecutingObject function OnUpdate() currentX = thisGameObject.WorldRotation.EulerAngles.X newX = currentX + Space.Input.MouseY thisGameObject.WorldRotation = Quaternion.Euler(newX , 0, 0) end thisGameObject.OnUpdate(OnUpdate) ``` ##### ClickToWalk[​](#clicktowalk "Direct link to ClickToWalk") [SVector](/scripting/client-scripting-api-reference/types/svector.md)? **TurnAxis** `get` *Returns the Turn Axis (-1 to 1 on Vector's X value).* * Lua ```lua turnAxis = Space.Input.TurnAxis ``` * Lua ```lua --makes this object color red if player is turning left ``` ##### Fire[​](#fire "Direct link to Fire") bool **Fire** `get` *Return true if primary fire is pressed (Mouselook Mode).* * Lua ```lua fireIsPressed = Space.Input.Fire ``` * Lua ```lua --Create a GameObject from resource when Primary Fire button is pressed --[Add resource "bullet" as a resource in scripting runtime component] thisGameObject = Space.Host.ExecutingObject bullet = Space.GetResource("bullet") OnUpdate = function() if Space.Input.Fire then Space.Scene.CreateGameObject(bullet) end end thisGameObject.OnUpdate(OnUpdate) ``` ##### AltFire[​](#altfire "Direct link to AltFire") bool **AltFire** `get` *Return true if alternative fire is pressed (Mouselook Mode)* * Lua ```lua altFireIsPressed = Space.Input.AltFire ``` * Lua ```lua --Create a GameObject from resource when Alternate Fire button is pressed --[Add resource "bullet" as a resource in scripting runtime component] thisGameObject = Space.Host.ExecutingObject bullet = Space.GetResource("bullet") OnUpdate = function() if Space.Input.AltFire then Space.Scene.CreateGameObject(bullet) end end thisGameObject.OnUpdate(OnUpdate) ``` ##### CursorInUI[​](#cursorinui "Direct link to CursorInUI") bool **CursorInUI** `get` *Returns true if the cursor is over the Sinespace UI.* * Lua ```lua cursorInUI = Space.Input.CursorInUI ``` * Lua ```lua --this object is going to listen to your scroll wheel movement and move accordingly --UNLESS your cursor is on the sinespace UI --(Example: Scrolling chat won't also move the object) thisGameObject = Space.Host.ExecutingObject OnUpdate = function() if Space.Input.CursorInUI == false then thisGameObject.WorldPosition = thisGameObject.WorldPosition + (thisGameObject.Up * Space.Input.ScrollWheel) end end thisGameObject.OnUpdate(OnUpdate) ``` ##### IsVRAvailable[​](#isvravailable "Direct link to IsVRAvailable") bool **IsVRAvailable** `get` *Returns true if VR is available.* * Lua ```lua isAvailable = Space.Input.IsVRAvailable ``` ##### IsVRActive[​](#isvractive "Direct link to IsVRActive") bool **IsVRActive** `get` *Returns true if VR is active.* * Lua ```lua turnAxis = Space.Input.TurnAxis ``` ##### **VRLeftControllerPosition**[​](#vrleftcontrollerposition "Direct link to vrleftcontrollerposition") [SVector](/scripting/client-scripting-api-reference/types/svector.md)? **VRLeftControllerPosition** `get` *Returns position of Left VR Controller.* * Lua ```lua posVRleft = Space.Input.VRLeftControllerPosition ``` ##### **VRRightControllerPosition**[​](#vrrightcontrollerposition "Direct link to vrrightcontrollerposition") [SVector](/scripting/client-scripting-api-reference/types/svector.md)? **VRRightControllerPosition** `get` *Returns position of Right VR Controller.* * Lua ```lua posVRright = Space.Input.VRRightControllerPosition ``` ##### **VRLeftControllerRotation**[​](#vrleftcontrollerrotation "Direct link to vrleftcontrollerrotation") [SQuaternion](/scripting/client-scripting-api-reference/types/squaternion.md)? **VRLeftControllerRotation** `get` *Returns rotation of Left VR Controller.* * Lua ```lua rotVRleft = Space.Input.VRLeftControllerRotation ``` ##### **VRRightControllerRotation**[​](#vrrightcontrollerrotation "Direct link to vrrightcontrollerrotation") [SQuaternion](/scripting/client-scripting-api-reference/types/squaternion.md)? **VRRightControllerRotation** `get` *Returns rotation of Right VR Controller.* * Lua ```lua rotVRright = Space.Input.VRRightControllerRotation ``` #### Input Key Names[​](#input-key-names "Direct link to Input Key Names") Key names follow these naming conventions: | **Key family** | **Naming convention** | | -------------- | ------------------------------------------------------------------------------------------------------------------- | | Letter keys | `a`, `b`, `c`… | | Number keys | `1`, `2`, `3`… | | Arrow keys | `up`, `down`, `left`, `right` | | Numpad keys | `[1]`, `[2]`, `[3]`, `[+]`, `[equals]`… | | Modifier keys | `right shift`, `left shift`, `right ctrl`, `left ctrl`, `right alt`, `left alt`, `right cmd`, `left cmd` | | Special keys | `backspace`, `tab`, `return`, `escape`, `space`, `delete`, `enter`, `insert`, `home`, `end`, `page up`, `page down` | | Function keys | `f1`, `f2`, `f3`… | Mouse buttons are named `mouse 0, mouse 1, mouse 2,` and so on. Joystick buttons follow these naming conventions: | **Button origin** | **Naming convention** | | ---------------------------------------- | -------------------------------------------------------------------- | | A specific button on any joystick | `joystick button 0`, `joystick button 1`, `joystick button 2`… | | A specific button on a specific joystick | `joystick 1 button 0`, `joystick 1 button 1`, `joystick 2 button 0`… | --- ### SShared #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | void [**SetGlobal**](sshared#setglobal)(string ns, string key, DynValue value) | | void [**SetSuperGlobal**](sshared#setsuperglobal)(string ns, string key, DynValue value) | | DynValue [**GetGlobal**](sshared#getglobal)(string ns, string key) | | DynValue [**GetSuperGlobal**](sshared#getsuperglobal)(string ns, string key) | | void [**RegisterFunction**](sshared#registerfunction)(string ns, string func, Closure reference) | | void [**RegisterBroadcastFunction**](sshared#registerbroadcastfunction)(string ns, string func, Closure reference) | | void [**UnregisterBroadcastFunction**](sshared#unregisterbroadcastfunction)(string ns, string func, Closure reference)void [**UnregisterBroadcastFunction**](sshared#unregisterbroadcastfunction)(string ns, string func) | | void [**CallFunction**](sshared#callfunction)(string ns, string func, IEnumerable< DynValue > args) | | void [**CallBroadcastFunction**](sshared#callbroadcastfunction)(string ns, string func, IEnumerable< DynValue > args) | #### Functions[​](#functions "Direct link to Functions") ##### SetGlobal[​](#setglobal "Direct link to SetGlobal") void **SetGlobal**(string ns, string key, DynValue value) *Sets a global key to a value. The value can be any object type.* | Parameter | Type | Description | | --------- | -------- | ----------- | | ns | string | | | key | string | | | value | DynValue | | * Lua ```lua Space.Shared.SetGlobal("com.someNameHere.world", "version", "1.02"); ``` * Lua ```lua -- This one script placed on a multiple number of objects will track the number -- of clicks user has made using a Global Variable -- note: the GetGlobal/SetGlobal functions are client side thisObject = Space.Host.ExecutingObject namespace = "com.example.shared" key = "clicktracker" OnClick = function() local currentClicks = Space.Shared.GetGlobal(namespace, key) if currentClicks == nil then currentClicks = 1 else currentClicks = currentClicks + 1 end Space.Shared.SetGlobal(namespace, key, currentClicks) Space.Log("Total Clicks = " .. currentClicks) end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### SetSuperGlobal[​](#setsuperglobal "Direct link to SetSuperGlobal") void **SetSuperGlobal**(string ns, string key, DynValue value) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Shared.SetSuperGlobal("com.someNameHere.world", "version", "1.02"); ``` * Lua ```lua example 2 ``` ##### GetGlobal[​](#getglobal "Direct link to GetGlobal") DynValue **GetGlobal**(string ns, string key) *Retrieves a previously set global variable, or returns nil.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua versionValue = Space.Shared.GetGlobal("com.someNameHere.world", "version") ``` * Lua ```lua -- This one script placed on a multiple number of objects will track the number -- of clicks user has made using a Global Variable -- note: the GetGlobal/SetGlobal functions are client side thisObject = Space.Host.ExecutingObject namespace = "com.example.shared" key = "clicktracker" OnClick = function() local currentClicks = Space.Shared.GetGlobal(namespace, key) if currentClicks == nil then currentClicks = 1 else currentClicks = currentClicks + 1 end Space.Shared.SetGlobal(namespace, key, currentClicks) Space.Log("Total Clicks = " .. currentClicks) end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### GetSuperGlobal[​](#getsuperglobal "Direct link to GetSuperGlobal") DynValue **GetSuperGlobal**(string ns, string key) *Retrieves a previously set super global variable, or returns nil.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua versionValue = Space.Shared.GetSuperGlobal("com.someNameHere.world", "version"); ``` * Lua ```lua --these two scripts are in two different regions but script B will know that you came from A --REGION A script username = Space.Scene.PlayerAvatar.Username region = Space.Scene.Name Space.Shared.SetSuperGlobal (username, "Last Location", region) --REGION B script username = Space.Scene.PlayerAvatar.Username region = Space.Shared.GetSuperGlobal (username, "Last Location") Space.Dialogues.SendLocalChat ("You have arrived from ".. region, "Last Location") ``` ##### RegisterFunction[​](#registerfunction "Direct link to RegisterFunction") void **RegisterFunction**(string ns, string func, Closure reference) *Makes func into a global function that can be accessed anywhere.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua function someFunction(name) Space.Log("Hello " .. name); end Space.Shared.RegisterFunction("com.someNameHere.world", "func", someFunction); ``` * Lua ```lua --Script placed on object A will allow other objects to call one of it's registered functions when clicked --Script in Object A thisObject = Space.Host.ExecutingObject namespace = "com.example.shared" LogFunction = function(Parameter) Space.Log("I've been called with parameter: " .. Parameter) end Space.Shared.RegisterFunction(namespace, "Log", LogFunction) -- Script in Other Objects thisObject = Space.Host.ExecutingObject namespace = "com.example.shared" OnClick = function() Space.Shared.CallFunction(namespace, "Log", {"Example"}) end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### RegisterBroadcastFunction[​](#registerbroadcastfunction "Direct link to RegisterBroadcastFunction") void **RegisterBroadcastFunction**(string ns, string func, Closure reference) *Makes func into a global function that can be accessed anywhere.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua function someFunction(name) Space.Log("Hello " .. name); end Space.Shared.RegisterBroadcastFunction("com.someNameHere.world", "func", someFunction); ``` ##### UnregisterBroadcastFunction[​](#unregisterbroadcastfunction "Direct link to UnregisterBroadcastFunction") void **UnregisterBroadcastFunction**(string ns, string func, Closure reference)
void **UnregisterBroadcastFunction**(string ns, string func) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua -- Script A: Receiver function someFunction(status) if status == "start" then Space.Log("Do receiver 1 procedures.") end end Space.Shared.RegisterBroadcastFunction("com.someNameHere.world", "func", someFunction); -- Script B: Another Receiver function someFunction(status) if status == "start" then Space.Log("Do receiver 2 procedures.") end end Space.Shared.RegisterBroadcastFunction("com.someNameHere.world", "func", someFunction); --Script C: Sender local ball = Space.Host.ExecutingObject; ball.SubscribeToEvents(); function onDown() local queue = Space.Shared.CallBroadcastFunction("com.someNameHere.world", "func", {"start"}); Space.Log("number in queue: " .. queue); Space.Shared.UnregisterBroadcastFunction("com.someNameHere.world", "func", someFunction); Space.Log("UnregisterBroadcastFunction"); end ball.OnMouseDown(onDown); ``` ##### CallFunction[​](#callfunction "Direct link to CallFunction") void **CallFunction**(string ns, string func, IEnumerable< DynValue > args) *Calls the registered function with the specified arguments.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Shared.CallFunction("com.someNameHere.world", "func",{"Smith"}); ``` * Lua ```lua --Script placed on object A will allow other objects to call one of it's registered functions when clicked --Script in Object A thisObject = Space.Host.ExecutingObject namespace = "com.example.shared" LogFunction = function(Parameter) Space.Log("I've been called with parameter: " .. Parameter) end Space.Shared.RegisterFunction(namespace, "Log", LogFunction) -- Script in Other Objects thisObject = Space.Host.ExecutingObject namespace = "com.example.shared" OnClick = function() Space.Shared.CallFunction(namespace, "Log", {"Example"}) end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### CallBroadcastFunction[​](#callbroadcastfunction "Direct link to CallBroadcastFunction") void **CallBroadcastFunction**(string ns, string func, IEnumerable< DynValue > args) *Makes func into a global function that can be accessed anywhere.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua function someFunction(name) Space.Log("Hello " .. name); end Space.Shared.RegisterBroadcastFunction("com.someNameHere.world", "func", someFunction); ``` --- ### SUI #### Functions[​](#functions "Direct link to Functions") ##### AddNotification[​](#addnotification "Direct link to AddNotification") void **AddNotification** (string title, string text) *Shows a notification* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.UI.AddNotification('Warning','This is a notification') ``` * Lua ```lua --This script will send a notification every time a new player joins region --including the users name function sendNotification(Av) Space.UI.AddNotification("New User","User joined: " .. Av.Username) end Space.Scene.OnPlayerJoin(sendNotification) ``` ##### OpenAppearanceEditor[​](#openappearanceeditor "Direct link to OpenAppearanceEditor") void **OpenAppearanceEditor**() *Opens the Appearance Editor (Outfit)* * Lua ```lua Space.UI.OpenAppearanceEditor() ``` * Lua ```lua --This script will make a button open the Appearance Editor --(example: tools for user to customize UI) --[You need to add a UI Button as a reference in the Scripting Runtime Component] theButton = Space.Host.GetReference('TheButton') OnClick = function() Space.UI.OpenAppearanceEditor() end theButton.UIButton.OnClick(OnClick) ``` ##### ShowPathToLocation[​](#showpathtolocation "Direct link to ShowPathToLocation") void **ShowPathToLocation** (string reason, [SVector](/scripting/client-scripting-api-reference/types/svector.md) location) *Shows a path to given location* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.UI.ShowPathToLocation("A Reason", aLocation) ``` ##### ShowLocation[​](#showlocation "Direct link to ShowLocation") void **ShowLocation** (string reason, [SVector](/scripting/client-scripting-api-reference/types/svector.md) location) *Shows given location* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.UI.ShowLocation("the reason", aLocation) ``` ##### AddGlobalActionButton[​](#addglobalactionbutton "Direct link to AddGlobalActionButton") void **AddGlobalActionButton** (string button, string tooltip, Closure action) Adds a "Global Action Button" which is a custom button you add to the UI that calls an action of your choice then clears after being clicked | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.UI.AddGlobalActionButton("Button 1", "Stand Up", aFunction) ``` ##### ClearGlobalActionButton[​](#clearglobalactionbutton "Direct link to ClearGlobalActionButton") void **ClearGlobalActionButton** (string button) *Clears a previously added Global Action Button 'button'* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.UI.ClearGlobalActionButton("The Button") ``` * Lua ```lua --This script will make this object make you dance when clicked --and also show a Global Action button to let you stop the dance (and clear that button) --[required: Add the dance animation to the Scripting Runtime's "Resources" section with name "dance"] thisObj = Space.Host.ExecutingObject danceAnim = Space.GetResource("dance") isDancing = false gbClick = function() Space.Scene.PlayerAvatar.StopCustomAnimation() Space.UI.ClearGlobalActionButton("Stop Dance") isDancing = false end OnClick = function() if not isDancing then Space.Scene.PlayerAvatar.PlayCustomAnimation(danceAnim) Space.UI.AddGlobalActionButton("Stop Dance","", gbClick) isDancing = true end end thisObj.AddClickable() thisObj.Clickable.OnClick(OnClick) ``` ##### OpenQuestsWindow[​](#openquestswindow "Direct link to OpenQuestsWindow") void **OpenQuestsWindow** () *Opens the Quests window. *(white-label grid only)** * Lua ```lua Space.UI.OpenQuestsWindow() ``` * Lua ```lua example --This script will make a button show/hide the Quests Window --(example: tools for user to customize UI) --[You need to add a UI Button as a reference in the Scripting Runtime Component] theButton = Space.Host.GetReference('TheButton') local isShown = false OnClick = function() if isShown then Space.UI.HideQuestsWindow() isShown = false else Space.UI.OpenQuestsWindow() isShown = true end end theButton.UIButton.OnClick(OnClick) ``` ##### HideQuestsWindow[​](#hidequestswindow "Direct link to HideQuestsWindow") void **HideQuestsWindow** () *Hides the Quests window. *(white-label grid only)** * Lua ```lua Space.UI.HideQuestsWindow() ``` * Lua ```lua --This script will make a button show/hide the Quests Window --(example: tools for user to customize UI) --[You need to add a UI Button as a reference in the Scripting Runtime Component] theButton = Space.Host.GetReference('TheButton') local isShown = false OnClick = function() if isShown then Space.UI.HideQuestsWindow() isShown = false else Space.UI.OpenQuestsWindow() isShown = true end end theButton.UIButton.OnClick(OnClick) ``` ##### OpenSettingsWindow[​](#opensettingswindow "Direct link to OpenSettingsWindow") void **OpenSettingsWindow** () *Opens the Settings window. *(white-label grid only)** * Lua ```lua Space.UI.OpenSettingsWindow() ``` * Lua ```lua --This script will make a button show/hide the Settings Window --(example: tools for user to customize UI) --[You need to add a UI Button as a reference in the Scripting Runtime Component] theButton = Space.Host.GetReference('TheButton') local isShown = false OnClick = function() if isShown then Space.UI.HideSettingsWindow() isShown = false else Space.UI.OpenSettingsWindow() isShown = true end end theButton.UIButton.OnClick(OnClick) ``` ##### HideSettingsWindow[​](#hidesettingswindow "Direct link to HideSettingsWindow") void **HideSettingsWindow** () *Hides the Settings window. *(white-label grid only)** * Lua ```lua Space.UI.HideSettingsWindow() ``` * Lua ```lua --This script will make a button show/hide the Settings Window --(example: tools for user to customize UI) --[You need to add a UI Button as a reference in the Scripting Runtime Component] theButton = Space.Host.GetReference('TheButton') local isShown = false OnClick = function() if isShown then Space.UI.HideSettingsWindow() isShown = false else Space.UI.OpenSettingsWindow() isShown = true end end theButton.UIButton.OnClick(OnClick) ``` ##### OpenFriendsWindow[​](#openfriendswindow "Direct link to OpenFriendsWindow") void **OpenFriendsWindow** () *Opens the Friends window. *(white-label grid only)** * Lua ```lua Space.UI.OpenFriendsWindow() ``` * Lua ```lua --This script will make a button show/hide the Friends Window--(example: tools for user to customize UI)--[You need to add a UI Button as a reference in the Scripting Runtime Component]theButton = Space.Host.GetReference('TheButton')local isShown = falseOnClick = function() if isShown then Space.UI.HideFriendsWindow() isShown = false else Space.UI.OpenFriendsWindow() isShown = true endendtheButton.UIButton.OnClick(OnClick) HideFriendsWindow ``` ##### HideFriendsWindow[​](#hidefriendswindow "Direct link to HideFriendsWindow") void **HideFriendsWindow** () *Hides the Friends window. *(white-label grid only)** * Lua ```lua Space.UI.HideFriendsWindow() ``` * Lua ```lua --This script will make a button show/hide the Friends Window --(example: tools for user to customize UI) --[You need to add a UI Button as a reference in the Scripting Runtime Component] theButton = Space.Host.GetReference('TheButton') local isShown = false OnClick = function() if isShown then Space.UI.HideFriendsWindow() isShown = false else Space.UI.OpenFriendsWindow() isShown = true end end theButton.UIButton.OnClick(OnClick) ``` ##### OpenExploreWindow[​](#openexplorewindow "Direct link to OpenExploreWindow") void **OpenExploreWindow** () *Opens the Explore window. *(white-label grid only)** * Lua ```lua Space.UI.OpenExploreWindow() ``` * Lua ```lua --This script will make a button show/hide the Explore Window --(example: tools for user to customize UI) --[You need to add a UI Button as a reference in the Scripting Runtime Component] theButton = Space.Host.GetReference('TheButton') local isShown = false OnClick = function() if isShown then Space.UI.HideExploreWindow() isShown = false else Space.UI.OpenExploreWindow() isShown = true end end theButton.UIButton.OnClick(OnClick) ``` ##### HideExploreWindow[​](#hideexplorewindow "Direct link to HideExploreWindow") void **HideExploreWindow** () *Hides the Explore window (white-label grid only)* * Lua ```lua Space.UI.HideExploreWindow() ``` * Lua ```lua --This script will make a button show/hide the Explore Window --(example: tools for user to customize UI) --[You need to add a UI Button as a reference in the Scripting Runtime Component] theButton = Space.Host.GetReference('TheButton') local isShown = false OnClick = function() if isShown then Space.UI.HideExploreWindow() isShown = false else Space.UI.OpenExploreWindow() isShown = true end end theButton.UIButton.OnClick(OnClick) ``` ##### OpenEventsWindow[​](#openeventswindow "Direct link to OpenEventsWindow") void **OpenEventsWindow** () *Opens the Events window (white-label grid only)* * Lua ```lua Space.UI.OpenEventsWindow() ``` * Lua ```lua --This script will make a button show/hide the Events Window --(example: tools for user to customize UI) --[You need to add a UI Button as a reference in the Scripting Runtime Component] theButton = Space.Host.GetReference('TheButton') local isShown = false OnClick = function() if isShown then Space.UI.HideEventsWindow() isShown = false else Space.UI.OpenEventsWindow() isShown = true end end theButton.UIButton.OnClick(OnClick) ``` ##### HideEventsWindow[​](#hideeventswindow "Direct link to HideEventsWindow") void **HideEventsWindow** () *Hides the Events window (white-label grid only)* * Lua ```lua Space.UI.HideEventsWindow() ``` * Lua ```lua --This script will make a button show/hide the Events Window --(example: tools for user to customize UI) --[You need to add a UI Button as a reference in the Scripting Runtime Component] theButton = Space.Host.GetReference('TheButton') local isShown = false OnClick = function() if isShown then Space.UI.HideEventsWindow() isShown = false else Space.UI.OpenEventsWindow() isShown = true end end theButton.UIButton.OnClick(OnClick) ``` ##### OpenHomeWindow[​](#openhomewindow "Direct link to OpenHomeWindow") void **OpenHomeWindow** () *Opens the Home window (white-label grid only)* * Lua ```lua Space.UI.OpenHomeWindow() ``` * Lua ```lua --This script will make a button show/hide the Home Window --(example: tools for user to customize UI) --[You need to add a UI Button as a reference in the Scripting Runtime Component] theButton = Space.Host.GetReference('TheButton') local isShown = false OnClick = function() if isShown then Space.UI.HideHomeWindow() isShown = false else Space.UI.OpenHomeWindow() isShown = true end end theButton.UIButton.OnClick(OnClick) ``` ##### HideHomeWindow[​](#hidehomewindow "Direct link to HideHomeWindow") void **HideHomeWindow** () *Hides the Home window (white-label grid only)* * Lua ```lua Space.UI.HideHomeWindow() ``` * Lua ```lua --This script will make a button show/hide the Home Window --(example: tools for user to customize UI) --[You need to add a UI Button as a reference in the Scripting Runtime Component] theButton = Space.Host.GetReference('TheButton') local isShown = false OnClick = function() if isShown then Space.UI.HideHomeWindow() isShown = false else Space.UI.OpenHomeWindow() isShown = true end end theButton.UIButton.OnClick(OnClick) ``` ##### OpenInventoryWindow[​](#openinventorywindow "Direct link to OpenInventoryWindow") void **OpenInventoryWindow** () *Opens the Inventory window (white-label grid only)* * Lua ```lua Space.UI.OpenInventoryWindow() ``` * Lua ```lua --This script will make a button show/hide the Inventory Window --(example: tools for user to customize UI) --[You need to add a UI Button as a reference in the Scripting Runtime Component] theButton = Space.Host.GetReference('TheButton') local isShown = false OnClick = function() if isShown then Space.UI.HideInventoryWindow() isShown = false else Space.UI.OpenInventoryWindow() isShown = true end end theButton.UIButton.OnClick(OnClick) ``` ##### HideInventoryWindow[​](#hideinventorywindow "Direct link to HideInventoryWindow") void **HideInventoryWindow** () *Hides the Inventory window (white-label grid only)* * Lua ```lua Space.UI.HideInventoryWindow() ``` * Lua ```lua --This script will make a button show/hide the Inventory Window --(example: tools for user to customize UI) --[You need to add a UI Button as a reference in the Scripting Runtime Component] theButton = Space.Host.GetReference('TheButton') local isShown = false OnClick = function() if isShown then Space.UI.HideInventoryWindow() isShown = false else Space.UI.OpenInventoryWindow() isShown = true end end theButton.UIButton.OnClick(OnClick) ``` ##### OpenOutfitWindow[​](#openoutfitwindow "Direct link to OpenOutfitWindow") void **OpenOutfitWindow** () *Opens the Outfit window (white-label grid only)* * Lua ```lua Space.UI.OpenOutfitWindow() ``` * Lua ```lua --This script will make a button show/hide the Outfit Window --(example: tools for user to customize UI) --[You need to add a UI Button as a reference in the Scripting Runtime Component] theButton = Space.Host.GetReference('TheButton') local isShown = false OnClick = function() if isShown then Space.UI.HideOutfitWindow() isShown = false else Space.UI.OpenOutfitWindow() isShown = true end end theButton.UIButton.OnClick(OnClick) ``` ##### HideOutfitWindow[​](#hideoutfitwindow "Direct link to HideOutfitWindow") void **HideOutfitWindow** () *Hides the Outfit window (white-label grid only)* * Lua ```lua Space.UI.HideOutfitWindow() ``` * Lua ```lua --This script will make a button show/hide the Outfit Window --(example: tools for user to customize UI) --[You need to add a UI Button as a reference in the Scripting Runtime Component] theButton = Space.Host.GetReference('TheButton') local isShown = false OnClick = function() if isShown then Space.UI.HideOutfitWindow() isShown = false else Space.UI.OpenOutfitWindow() isShown = true end end theButton.UIButton.OnClick(OnClick) ``` ##### OpenShopWindow[​](#openshopwindow "Direct link to OpenShopWindow") void **OpenShopWindow** () *Opens the Shop window (white-label grid only)* * Lua ```lua Space.UI.OpenShopWindow() ``` * Lua ```lua --This script will make a button show/hide the Shop Window --(example: tools for user to customize UI) --[You need to add a UI Button as a reference in the Scripting Runtime Component] theButton = Space.Host.GetReference('TheButton') local isShown = false OnClick = function() if isShown then Space.UI.HideShopWindow() isShown = false else Space.UI.OpenShopWindow() isShown = true end end theButton.UIButton.OnClick(OnClick) ``` ##### HideShopWindow[​](#hideshopwindow "Direct link to HideShopWindow") void **HideShopWindow** () *Hides the Shop window (white-label grid only)* * Lua ```lua Space.UI.HideShopWindow() ``` * Lua ```lua --This script will make a button show/hide the Shop Window --(example: tools for user to customize UI) --[You need to add a UI Button as a reference in the Scripting Runtime Component] theButton = Space.Host.GetReference('TheButton') local isShown = false OnClick = function() if isShown then Space.UI.HideShopWindow() isShown = false else Space.UI.OpenShopWindow() isShown = true end end theButton.UIButton.OnClick(OnClick) ``` ##### OpenSnapshotWindow[​](#opensnapshotwindow "Direct link to OpenSnapshotWindow") void **OpenSnapshotWindow** () *Opens the Snapshot window (white-label grid only)* * Lua ```lua Space.UI.OpenSnapshotWindow() ``` * Lua ```lua --This script will make a button show/hide the Snapshot Window --(example: tools for user to customize UI) --[You need to add a UI Button as a reference in the Scripting Runtime Component] theButton = Space.Host.GetReference('TheButton') local isShown = false OnClick = function() if isShown then Space.UI.HideSnapshotWindow() isShown = false else Space.UI.OpenSnapshotWindow() isShown = true end end theButton.UIButton.OnClick(OnClick) ``` ##### HideSnapshotWindow[​](#hidesnapshotwindow "Direct link to HideSnapshotWindow") void **HideSnapshotWindow** () *Hides the Snapshot window (white-label grid only)* * Lua ```lua Space.UI.HideSnapshotWindow() ``` * Lua ```lua --This script will make a button show/hide the Snapshot Window --(example: tools for user to customize UI) --[You need to add a UI Button as a reference in the Scripting Runtime Component] theButton = Space.Host.GetReference('TheButton') local isShown = false OnClick = function() if isShown then Space.UI.HideSnapshotWindow() isShown = false else Space.UI.OpenSnapshotWindow() isShown = true end end theButton.UIButton.OnClick(OnClick) ``` ##### OpenHelpWindow[​](#openhelpwindow "Direct link to OpenHelpWindow") void **OpenHelpWindow** () *Opens the Help window (white-label grid only)* * Lua ```lua Space.UI.OpenHelpWindow() ``` * Lua ```lua --This script will make a button show/hide the Help Window --(example: tools for user to customize UI) --[You need to add a UI Button as a reference in the Scripting Runtime Component] theButton = Space.Host.GetReference('TheButton') local isShown = false OnClick = function() if isShown then Space.UI.HideHelpWindow() isShown = false else Space.UI.OpenHelpWindow() isShown = true end end theButton.UIButton.OnClick(OnClick) ``` ##### HideHelpWindow[​](#hidehelpwindow "Direct link to HideHelpWindow") void **HideHelpWindow** () *Hides the Help window (white-label grid only)* * Lua ```lua Space.UI.HideHelpWindow() ``` * Lua ```lua --This script will make a button show/hide the Help Window --(example: tools for user to customize UI) --[You need to add a UI Button as a reference in the Scripting Runtime Component] theButton = Space.Host.GetReference('TheButton') local isShown = false OnClick = function() if isShown then Space.UI.HideHelpWindow() isShown = false else Space.UI.OpenHelpWindow() isShown = true end end theButton.UIButton.OnClick(OnClick) ``` ##### OpenProfileWin[​](#openprofilewin "Direct link to OpenProfileWin") void **OpenProfileWin** () *Opens the Profile window (white-label grid only)* * Lua ```lua Space.UI.OpenProfileWin() ``` * Lua ```lua --This script will make a button show/hide the Profile Win --(example: tools for user to customize UI) --[You need to add a UI Button as a reference in the Scripting Runtime Component] theButton = Space.Host.GetReference('TheButton') local isShown = false OnClick = function() if isShown then Space.UI.HideProfileWindow() isShown = false else Space.UI.OpenProfileWin() isShown = true end end theButton.UIButton.OnClick(OnClick) ``` ##### HideProfileWindow[​](#hideprofilewindow "Direct link to HideProfileWindow") void **HideProfileWindow**() *Hides the Profile window (white-label grid only)* * Lua ```lua Space.UI.HideProfileWindow() ``` * Lua ```lua --This script will make a button show/hide the Profile Win --[You need to add a UI Button as a reference in the Scripting Runtime Component] theButton = Space.Host.GetReference('TheButton') local isShown = false OnClick = function() if isShown then Space.UI.HideProfileWindow() isShown = false else Space.UI.OpenProfileWin() isShown = true end end theButton.UIButton.OnClick(OnClick) ``` ##### OpenUpgradeAccountWindow[​](#openupgradeaccountwindow "Direct link to OpenUpgradeAccountWindow") void **OpenUpgradeAccountWindow** () *Opens the Upgrade Account window (white-label grid only)* * Lua ```lua Space.UI.OpenUpgradeAccountWindow() ``` * Lua ```lua --This script will make a button show/hide the Upgrade Account Window --(example: tools for user to customize UI) --[You need to add a UI Button as a reference in the Scripting Runtime Component] theButton = Space.Host.GetReference('TheButton') local isShown = false OnClick = function() if isShown then Space.UI.HideUpgradeAccountWindow() isShown = false else Space.UI.OpenUpgradeAccountWindow() isShown = true end end theButton.UIButton.OnClick(OnClick) ``` ##### HideUpgradeAccountWindow[​](#hideupgradeaccountwindow "Direct link to HideUpgradeAccountWindow") void **HideUpgradeAccountWindow** () *Hides the Upgrade Account window (white-label grid only)* * Lua ```lua Space.UI.HideUpgradeAccountWindow() ``` * Lua ```lua --This script will make a button show/hide the Upgrade Account Window --(example: tools for user to customize UI) --[You need to add a UI Button as a reference in the Scripting Runtime Component] theButton = Space.Host.GetReference('TheButton') local isShown = false OnClick = function() if isShown then Space.UI.HideUpgradeAccountWindow() isShown = false else Space.UI.OpenUpgradeAccountWindow() isShown = true end end theButton.UIButton.OnClick(OnClick) ``` ##### OpenRegionInfoWindow[​](#openregioninfowindow "Direct link to OpenRegionInfoWindow") void **OpenRegionInfoWindow** () *Opens the Region Info window (white-label grid only)* * Lua ```lua Space.UI.OpenRegionInfoWindow() ``` * Lua ```lua --This script will make a button show/hide the Region Info Window --(example: tools for user to customize UI) --[You need to add a UI Button as a reference in the Scripting Runtime Component] theButton = Space.Host.GetReference('TheButton') local isShown = false OnClick = function() if isShown then Space.UI.HideRegionInfoWindow() isShown = false else Space.UI.OpenRegionInfoWindow() isShown = true end end theButton.UIButton.OnClick(OnClick) ``` ##### HideRegionInfoWindow[​](#hideregioninfowindow "Direct link to HideRegionInfoWindow") void **HideRegionInfoWindow** () *Hides the Region Info window (white-label grid only)* * Lua ```lua Space.UI.HideRegionInfoWindow() ``` * Lua ```lua --This script will make a button show/hide the Region Info Window --(example: tools for user to customize UI) --[You need to add a UI Button as a reference in the Scripting Runtime Component] theButton = Space.Host.GetReference('TheButton') local isShown = false OnClick = function() if isShown then Space.UI.HideRegionInfoWindow() isShown = false else Space.UI.OpenRegionInfoWindow() isShown = true end end theButton.UIButton.OnClick(OnClick) ``` ##### OpenExitWindow[​](#openexitwindow "Direct link to OpenExitWindow") void **OpenExitWindow** () *Opens the Exit window (white-label grid only)* * Lua ```lua Space.UI.OpenExitWindow() ``` * Lua ```lua --This script will make a button show/hide the Exit Window --(example: tools for user to customize UI) --[You need to add a UI Button as a reference in the Scripting Runtime Component] theButton = Space.Host.GetReference('TheButton') local isShown = false OnClick = function() if isShown then Space.UI.HideExitWindow() isShown = false else Space.UI.OpenExitWindow() isShown = true end end theButton.UIButton.OnClick(OnClick) ``` ##### HideExitWindow[​](#hideexitwindow "Direct link to HideExitWindow") void **HideExitWindow** () *Hides the Exit window (white-label grid only)* * Lua ```lua Space.UI.HideExitWindow() ``` * Lua ```lua --This script will make a button show/hide the Exit Window --(example: tools for user to customize UI) --[You need to add a UI Button as a reference in the Scripting Runtime Component] theButton = Space.Host.GetReference('TheButton') local isShown = false OnClick = function() if isShown then Space.UI.HideExitWindow() isShown = false else Space.UI.OpenExitWindow() isShown = true end end theButton.UIButton.OnClick(OnClick) ``` ##### OpenMailWindow[​](#openmailwindow "Direct link to OpenMailWindow") void **OpenMailWindow** () *Opens the Mail window (white-label grid only)* * Lua ```lua Space.UI.OpenMailWindow() ``` * Lua ```lua --This script will make a button show/hide the Mail Window --(example: tools for user to customize UI) --[You need to add a UI Button as a reference in the Scripting Runtime Component] theButton = Space.Host.GetReference('TheButton') local isShown = false OnClick = function() if isShown then Space.UI.HideMailWindow() isShown = false else Space.UI.OpenMailWindow() isShown = true end end theButton.UIButton.OnClick(OnClick) ``` ##### HideMailWindow[​](#hidemailwindow "Direct link to HideMailWindow") void **HideMailWindow** () *Hides the Mail window (white-label grid only)* * Lua ```lua Space.UI.HideMailWindow() ``` * Lua ```lua --This script will make a button show/hide the Mail Window --(example: tools for user to customize UI) --[You need to add a UI Button as a reference in the Scripting Runtime Component] theButton = Space.Host.GetReference('TheButton') local isShown = false OnClick = function() if isShown then Space.UI.HideMailWindow() isShown = false else Space.UI.OpenMailWindow() isShown = true end end theButton.UIButton.OnClick(OnClick) ``` ##### OpenFeedbackWindow[​](#openfeedbackwindow "Direct link to OpenFeedbackWindow") void **OpenFeedbackWindow** () *Shows the Feedback window (white-label grid only)* * Lua ```lua Space.UI.OpenFeedbackWindow() ``` * Lua ```lua --This script will make a button show/hide the Feedback Window --(example: tools for user to customize UI) --[You need to add a UI Button as a reference in the Scripting Runtime Component] theButton = Space.Host.GetReference('TheButton') local isShown = false OnClick = function() if isShown then Space.UI.HideFeedbackWindow() isShown = false else Space.UI.OpenFeedbackWindow() isShown = true end end theButton.UIButton.OnClick(OnClick) ``` ##### HideFeedbackWindow[​](#hidefeedbackwindow "Direct link to HideFeedbackWindow") void **HideFeedbackWindow** () *Hides the Feedback window (white-label grid only)* * Lua ```lua Space.UI.HideFeedbackWindow() ``` * Lua ```lua --This script will make a button show/hide the Mail Window --(example: tools for user to customize UI) --[You need to add a UI Button as a reference in the Scripting Runtime Component] theButton = Space.Host.GetReference('TheButton') local isShown = false OnClick = function() if isShown then Space.UI.HideFeedbackWindow() isShown = false else Space.UI.OpenFeedbackWindow() isShown = true end end theButton.UIButton.OnClick(OnClick) ``` ##### OpenBuyGoldWindow[​](#openbuygoldwindow "Direct link to OpenBuyGoldWindow") void **OpenBuyGoldWindow** () *Opens the Buy Gold window (white-label grid only)* * Lua ```lua Space.UI.OpenBuyGoldWindow() ``` * Lua ```lua --This script will make a button show/hide the Buy Gold Window --(example: tools for user to customize UI) --[You need to add a UI Button as a reference in the Scripting Runtime Component] theButton = Space.Host.GetReference('TheButton') local isShown = false OnClick = function() if isShown then Space.UI.HideBuyGoldWindow() isShown = false else Space.UI.OpenBuyGoldWindow() isShown = true end end theButton.UIButton.OnClick(OnClick) ``` ##### HideBuyGoldWindow[​](#hidebuygoldwindow "Direct link to HideBuyGoldWindow") void **HideBuyGoldWindow** () *Hides the Buy Gold window (white-label grid only)* * Lua ```lua Space.UI.HideBuyGoldWindow() ``` * Lua ```lua --This script will make a button show/hide the Buy Gold Window --(example: tools for user to customize UI) --[You need to add a UI Button as a reference in the Scripting Runtime Component] theButton = Space.Host.GetReference('TheButton') local isShown = false OnClick = function() if isShown then Space.UI.HideBuyGoldWindow() isShown = false else Space.UI.OpenBuyGoldWindow() isShown = true end end theButton.UIButton.OnClick(OnClick) ``` ##### OpenChatWindow[​](#openchatwindow "Direct link to OpenChatWindow") void **OpenChatWindow** () *Opens the Chat window (white-label grid only)* * Lua ```lua Space.UI.OpenChatWindow() ``` * Lua ```lua --This script will make a button show/hide the Chat Window --(example: tools for user to customize UI) --[You need to add a UI Button as a reference in the Scripting Runtime Component] theButton = Space.Host.GetReference('TheButton') local isShown = false OnClick = function() if isShown then Space.UI.HideChatWindow() isShown = false else Space.UI.OpenChatWindow() isShown = true end end theButton.UIButton.OnClick(OnClick) ``` ##### HideChatWindow[​](#hidechatwindow "Direct link to HideChatWindow") void **HideChatWindow** () *Hides the Chat window (white-label grid only)* * Lua ```lua Space.UI.HideChatWindow() ``` * Lua ```lua --This script will make a button show/hide the Chat Window --(example: tools for user to customize UI) --[You need to add a UI Button as a reference in the Scripting Runtime Component] theButton = Space.Host.GetReference('TheButton') local isShown = true OnClick = function() if isShown then Space.UI.HideChatWindow() isShown = false else Space.UI.OpenChatWindow() isShown = true end end theButton.UIButton.OnClick(OnClick) ``` ##### OpenRoomEditorWindow[​](#openroomeditorwindow "Direct link to OpenRoomEditorWindow") void **OpenRoomEditorWindow** () *Opens the Room Editor window (white-label grid only)* * Lua ```lua Space.UI.OpenRoomEditorWindow() ``` * Lua ```lua --This script will make a button show/hide the Room Editor Window --(example: tools for user to customize UI) --[You need to add a UI Button as a reference in the Scripting Runtime Component] theButton = Space.Host.GetReference('TheButton') local isShown = false OnClick = function() if isShown then Space.UI.HideRoomEditorWindow() isShown = false else Space.UI.OpenRoomEditorWindow() isShown = true end end theButton.UIButton.OnClick(OnClick) ``` ##### HideRoomEditorWindow[​](#hideroomeditorwindow "Direct link to HideRoomEditorWindow") void **HideRoomEditorWindow** () *Hides the Room Editor window (white-label grid only)* * Lua ```lua Space.UI.HideRoomEditorWindow() ``` * Lua ```lua --This script will make a button show/hide the Room Editor Window --(example: tools for user to customize UI) --[You need to add a UI Button as a reference in the Scripting Runtime Component] theButton = Space.Host.GetReference('TheButton') local isShown = false OnClick = function() if isShown then Space.UI.HideRoomEditorWindow() isShown = false else Space.UI.OpenRoomEditorWindow() isShown = true end end theButton.UIButton.OnClick(OnClick) ``` ##### OpenDevicePicker[​](#opendevicepicker "Direct link to OpenDevicePicker") void **OpenDevicePicker** () *Opens the Device Picker* * Lua ```lua Space.UI.OpenDevicePicker() ``` * Lua ```lua --This script will make a button open the Device Picker --[You need to add a UI Button as a reference in the Scripting Runtime Component] theButton = Space.Host.GetReference('TheButton') OnClick = function() Space.UI.OpenDevicePicker() end theButton.UIButton.OnClick(OnClick) ``` ##### OpenDeviceTester[​](#opendevicetester "Direct link to OpenDeviceTester") void **OpenDeviceTester** () *Opens the Device Tester* * Lua ```lua Space.UI.OpenDeviceTester() ``` ##### Raycast[​](#raycast "Direct link to Raycast") SUIRaycastResult **Raycast** () *Shoots a UI Raycast and returns the result as SUIRayCastResult* * Lua ```lua RayCastResult = Space.UI.Raycast() ``` * Lua ```lua --This script will update a UIText element with the result of a UIRaycast whenever... --the player clicks on a Sinespace UI element thisObject = Space.Host.ExecutingObject uiText = Space.Host.GetReference("text").UIText --Add this object with UIText component as reference in Scripting Runtime OnUpdate = function() if Space.Input.GetMouseDown(0) == true then result = Space.UI.Raycast() if result.IsValid then uiText = result.ToString() end end end thisObject.OnUpdate(OnUpdate) ``` #### Properties[​](#properties "Direct link to Properties") ##### ShowUI[​](#showui "Direct link to ShowUI") bool **ShowUI** `get` `set` *Show the User Interface* * Lua ```lua Space.UI.ShowUI = false ``` * Lua ```lua --This script will make a UI Toggle show/hide theUser Interface --[You need to add an object with UI Toggle as a reference (scripting runtime)] toggle = Space.Host.GetReference("Toggle").UIToggle OnValueChanged = function() if toggle.IsOn then Space.UI.ShowUI= true else Space.UI.ShowUI= false end end toggle.OnValueChanged(OnValueChanged) ``` ##### ShowWorldUI[​](#showworldui "Direct link to ShowWorldUI") bool **ShowWorldUI** `get` `set` *Show the World User Interface.* * Lua ```lua Space.UI.ShowWorldUI = false ``` * Lua ```lua --This script will make a UI Toggle show/hide the World UI --(example: tools for user to customize UI) --[You need to add an object with UI Toggle as a reference (scripting runtime)] toggle = Space.Host.GetReference("Toggle").UIToggle OnValueChanged = function() if toggle.IsOn then Space.UI.ShowWorldUI= true else Space.UI.ShowWorldUI= false end end toggle.OnValueChanged(OnValueChanged) ``` ##### MusicVolume[​](#musicvolume "Direct link to MusicVolume") int **MusicVolume** `get` `set` *Set/Get the Music volume (set: white-label grid only)* * Lua ```lua MusicVolume = Space.UI.MusicVolume ``` * Lua ```lua --This script will make moving a slider control the Music Volume --and also update a text field with the current Music Volume --(example: custom UI) --[You need to add the slider and text field as a reference] slider = Space.Host.GetReference("Slider").UISlider textField = Space.Host.GetReference("Text Field").UIText OnValueChanged = function() Space.UI.MusicVolume = slider.NormalizedValue * 100 textField.Text = Space.UI.MusicVolume end slider.OnValueChanged(OnValueChanged) ``` ##### MasterVolume[​](#mastervolume "Direct link to MasterVolume") int **MasterVolume** `get` `set` *Set/Get the Master volume (set: white-label grid only)* * Lua ```lua MasterVolume = Space.UI.MasterVolume ``` * Lua ```lua --This script will make moving a slider control the Master Volume --and also update a text field with the current Master Volume --(example: custom UI) --[You need to add the slider and text field as a reference] slider = Space.Host.GetReference("Slider").UISlider textField = Space.Host.GetReference("Text Field").UIText OnValueChanged = function() Space.UI.MasterVolume = slider.NormalizedValue * 100 textField.Text = Space.UI.MasterVolume end slider.OnValueChanged(OnValueChanged) ``` ##### SFXVolume[​](#sfxvolume "Direct link to SFXVolume") int **SFXVolume** `get` `set` *Set/Get the SFX volume (set: white-label grid only)* * Lua ```lua SFXVolume = Space.UI.SFXVolume ``` * Lua ```lua --This script will make moving a slider control the SFX Volume --and also update a text field with the current SFX Volume --(example: custom UI) --[You need to add the slider and text field as a reference] slider = Space.Host.GetReference("Slider").UISlider textField = Space.Host.GetReference("Text Field").UIText OnValueChanged = function() Space.UI.SFXVolume = slider.NormalizedValue * 100 textField.Text = Space.UI.SFXVolume end slider.OnValueChanged(OnValueChanged) ``` ##### UIVolume[​](#uivolume "Direct link to UIVolume") int **UIVolume** `get` `set` *Set/Get the UI volume (set: white-label grid only)* * Lua ```lua UIVolume = Space.UI.UIVolume ``` * Lua ```lua --This script will make moving a slider control the UI Volume --and also update a text field with the current UI Volume --[You need to add the slider and text field as a reference] slider = Space.Host.GetReference("Slider").UISlider textField = Space.Host.GetReference("Text Field").UIText OnValueChanged = function() Space.UI.UIVolume = slider.NormalizedValue * 100 textField.Text = Space.UI.UIVolume end slider.OnValueChanged(OnValueChanged) ``` ##### VOIPVolume[​](#voipvolume "Direct link to VOIPVolume") int **VOIPVolume** `get` `set` *Set/Get the VOIP volume (set: white-label grid only)* * Lua ```lua VOIPVolume = Space.UI.VOIPVolume ``` * Lua ```lua --This script will make moving a slider control the Voice Volume --and also update a text field with the current Voice Volume --[You need to add the slider and text field as a reference] slider = Space.Host.GetReference("Slider").UISlider textField = Space.Host.GetReference("Text Field").UIText OnValueChanged = function() Space.UI.VOIPVolume = slider.NormalizedValue * 100 textField.Text = Space.UI.VOIPVolume end slider.OnValueChanged(OnValueChanged) ``` ##### ShowFriendsButton[​](#showfriendsbutton "Direct link to ShowFriendsButton") bool **ShowFriendsButton** `get` `set` *Show the Friends button. *(white-label grid only)** * Lua ```lua Space.UI.ShowFriendsButton = false ``` * Lua ```lua --This script will make a UI Toggle show/hide the Friends Button --(example: tools for user to customize UI) --[You need to add an object with UI Toggle as a reference (scripting runtime)] toggle = Space.Host.GetReference("Toggle").UIToggle OnValueChanged = function() if toggle.IsOn then Space.UI.ShowFriendsButton = true else Space.UI.ShowFriendsButton = false end end toggle.OnValueChanged(OnValueChanged) ``` ##### ShowExploreButton[​](#showexplorebutton "Direct link to ShowExploreButton") bool **ShowExploreButton** `get` `set` *Show the Explore button. *(white-label grid only)** * Lua ```lua Space.UI.ShowExploreButton = false ``` * Lua ```lua --This script will make a UI Toggle show/hide the Explore Button --(example: tools for user to customize UI) --[You need to add an object with UI Toggle as a reference (scripting runtime)] toggle = Space.Host.GetReference("Toggle").UIToggle OnValueChanged = function() if toggle.IsOn then Space.UI.ShowExploreButton = true else Space.UI.ShowExploreButton = false end end toggle.OnValueChanged(OnValueChanged) ``` ##### ShowQuestsButton[​](#showquestsbutton "Direct link to ShowQuestsButton") bool **ShowQuestsButton** `get` `set` *Show the Quests button. *(white-label grid only)** * Lua ```lua Space.UI.ShowQuestsButton = false ``` * Lua ```lua --This script will make a UI Toggle show/hide the Quests button --(example: tools for user to customize UI) --[You need to add an object with UI Toggle as a reference (scripting runtime)] toggle = Space.Host.GetReference("Toggle").UIToggle OnValueChanged = function() if toggle.IsOn then Space.UI.ShowQuestsButton= true else Space.UI.ShowQuestsButton= false end end toggle.OnValueChanged(OnValueChanged) ``` ##### ShowInventoryButton[​](#showinventorybutton "Direct link to ShowInventoryButton") bool **ShowInventoryButton** `get` `set` *Show the Inventory button. *(white-label grid only)** * Lua ```lua Space.UI.ShowInventoryButton = false ``` * Lua ```lua --This script will make a UI Toggle show/hide the Inventory Button --(example: tools for user to customize UI) --[You need to add an object with UI Toggle as a reference (scripting runtime)] toggle = Space.Host.GetReference("Toggle").UIToggle OnValueChanged = function() if toggle.IsOn then Space.UI.ShowInventoryButton= true else Space.UI.ShowInventoryButton= false end end toggle.OnValueChanged(OnValueChanged) ``` ##### ShowOutfitButton[​](#showoutfitbutton "Direct link to ShowOutfitButton") bool **ShowOutfitButton** `get` `set` *Set to true to show the Outfit button. *(white-label grid only)** * Lua ```lua Space.UI.ShowOutfitButton = false ``` * Lua ```lua --This script will make a UI Toggle show/hide the Outfit Button --(example: tools for user to customize UI) --[You need to add an object with UI Toggle as a reference (scripting runtime)] toggle = Space.Host.GetReference("Toggle").UIToggle OnValueChanged = function() if toggle.IsOn then Space.UI.ShowOutfitButton= true else Space.UI.ShowOutfitButton= false end end toggle.OnValueChanged(OnValueChanged) ``` ##### ShowShopButton[​](#showshopbutton "Direct link to ShowShopButton") bool **ShowShopButton** `get` `set` *Show the Shop button. *(white-label grid only)** * Lua ```lua Space.UI.ShowShopButton = false ``` * Lua ```lua --This script will make a UI Toggle show/hide the Shop Button --(example: tools for user to customize UI) --[You need to add an object with UI Toggle as a reference (scripting runtime)] toggle = Space.Host.GetReference("Toggle").UIToggle OnValueChanged = function() if toggle.IsOn then Space.UI.ShowShopButton= true else Space.UI.ShowShopButton= false end end toggle.OnValueChanged(OnValueChanged) ``` ##### ShowAuctionButton[​](#showauctionbutton "Direct link to ShowAuctionButton") bool **ShowAuctionButton** `get` `set` *Show the Auction button. *(white-label grid only)** * Lua ```lua Space.UI.ShowAuctionButton = false ``` * Lua ```lua --This script will make a UI Toggle show/hide the Auction Button --(example: tools for user to customize UI) --[You need to add an object with UI Toggle as a reference (scripting runtime)] toggle = Space.Host.GetReference("Toggle").UIToggle OnValueChanged = function() if toggle.IsOn then Space.UI.ShowAuctionButton = true else Space.UI.ShowAuctionButton = false end end toggle.OnValueChanged(OnValueChanged) ``` ##### ShowSnapshotButton[​](#showsnapshotbutton "Direct link to ShowSnapshotButton") bool **ShowSnapshotButton** `get` `set` *Show the Snapshot button.*(white-label grid only)\*\* * Lua ```lua Space.UI.ShowSnapshotButton = false ``` * Lua ```lua --This script will make a UI Toggle show/hide the Snapshot Button --(example: tools for user to customize UI) --[You need to add an object with UI Toggle as a reference (scripting runtime)] toggle = Space.Host.GetReference("Toggle").UIToggle OnValueChanged = function() if toggle.IsOn then Space.UI.ShowSnapshotButton= true else Space.UI.ShowSnapshotButton= false end end toggle.OnValueChanged(OnValueChanged) ``` ##### ShowHelpButton[​](#showhelpbutton "Direct link to ShowHelpButton") bool **ShowHelpButton** `get` `set` *Show the Help button. *(white-label grid only)** * Lua ```lua Space.UI.ShowHelpButton = false ``` * Lua ```lua --This script will make a UI Toggle show/hide the Help Button --(example: tools for user to customize UI) --[You need to add an object with UI Toggle as a reference (scripting runtime)] toggle = Space.Host.GetReference("Toggle").UIToggle OnValueChanged = function() if toggle.IsOn then Space.UI.ShowHelpButton= true else Space.UI.ShowHelpButton= false end end toggle.OnValueChanged(OnValueChanged) ``` ##### ShowCurrencyButton[​](#showcurrencybutton "Direct link to ShowCurrencyButton") bool **ShowCurrencyButton** `get` `set` *Show the Currency button. *(white-label grid only)** * Lua ```lua Space.UI.ShowCurrencyButton = false ``` * Lua ```lua --This script will make a UI Toggle show/hide the Currency Button --(example: tools for user to customize UI) --[You need to add an object with UI Toggle as a reference (scripting runtime)] toggle = Space.Host.GetReference("Toggle").UIToggle OnValueChanged = function() if toggle.IsOn then Space.UI.ShowCurrencyButton= true else Space.UI.ShowCurrencyButton= false end end toggle.OnValueChanged(OnValueChanged) ``` ##### ShowGoldAndBuyButton[​](#showgoldandbuybutton "Direct link to ShowGoldAndBuyButton") bool **ShowGoldAndBuyButton** `get` `set` *Show the Gold and Buy button. *(white-label grid only)** * Lua ```lua Space.UI.ShowGoldAndBuyButton = false ``` * Lua ```lua --This script will make a UI Toggle show/hide the Gold and Buy button --(example: tools for user to customize UI) --[You need to add an object with UI Toggle as a reference (scripting runtime)] toggle = Space.Host.GetReference("Toggle").UIToggle OnValueChanged = function() if toggle.IsOn then Space.UI.ShowGoldAndBuyButton= true else Space.UI.ShowGoldAndBuyButton= false end end toggle.OnValueChanged(OnValueChanged) ``` ##### ShowChat[​](#showchat "Direct link to ShowChat") bool **ShowChat** `get` `set` *Show the Chat. *(white-label grid only)** * Lua ```lua Space.UI.ShowChat = false ``` * Lua ```lua --This script will make a UI Toggle show/hide the Chat --(example: tools for user to customize UI) --[You need to add an object with UI Toggle as a reference (scripting runtime)] toggle = Space.Host.GetReference("Toggle").UIToggle OnValueChanged = function() if toggle.IsOn then Space.UI.ShowChat= true else Space.UI.ShowChat= false end end toggle.OnValueChanged(OnValueChanged) ``` ##### ShowMiniMap[​](#showminimap "Direct link to ShowMiniMap") bool **ShowMiniMap** `get` `set` *Set to true to show the Minimap. *(white-label grid only)** * Lua ```lua Space.UI.ShowMiniMap = false ``` * Lua ```lua --This script will make a UI Toggle show/hide the Minimap --(example: tools for user to customize UI) --[You need to add an object with UI Toggle as a reference (scripting runtime)] toggle = Space.Host.GetReference("Toggle").UIToggle OnValueChanged = function() if toggle.IsOn then Space.UI.ShowMiniMap= true else Space.UI.ShowMiniMap= false end end toggle.OnValueChanged(OnValueChanged) ``` ##### ShowHotBar[​](#showhotbar "Direct link to ShowHotBar") bool **ShowHotBar** `get` `set` *Show the Hot Bar. *(white-label grid only)** * Lua ```lua Space.UI.ShowHotBar = false ``` * Lua ```lua --This script will make a UI Toggle show/hide the Hot Bar --(example: tools for user to customize UI) --[You need to add an object with UI Toggle as a reference (scripting runtime)] toggle = Space.Host.GetReference("Toggle").UIToggle OnValueChanged = function() if toggle.IsOn then Space.UI.ShowHotBar= true else Space.UI.ShowHotBar= false end end toggle.OnValueChanged(OnValueChanged) ``` ##### ShowEventsButton[​](#showeventsbutton "Direct link to ShowEventsButton") bool **ShowEventsButton** `get` `set` *Show the Events button. *(white-label grid only)** * Lua ```lua Space.UI.ShowEventsButton = false ``` * Lua ```lua --This script will make a UI Toggle show/hide the Events button --[You need to add an object with UI Toggle as a reference (scripting runtime)] toggle = Space.Host.GetReference("Toggle").UIToggle OnValueChanged = function() if toggle.IsOn then Space.UI.ShowEventsButton= true else Space.UI.ShowEventsButton= false end end toggle.OnValueChanged(OnValueChanged) ``` ##### ShowHomeButton[​](#showhomebutton "Direct link to ShowHomeButton") bool **ShowHomeButton** `get` `set` *Show the Home button. *(white-label grid only)** * Lua ```lua Space.UI.ShowHomeButton = false ``` * Lua ```lua --This script will make a UI Toggle show/hide the Home Button --(example: tools for user to customize UI) --[You need to add an object with UI Toggle as a reference (scripting runtime)] toggle = Space.Host.GetReference("Toggle").UIToggle OnValueChanged = function() if toggle.IsOn then Space.UI.ShowHomeButton= true else Space.UI.ShowHomeButton= false end end toggle.OnValueChanged(OnValueChanged) ``` ##### ShowActivityPanel[​](#showactivitypanel "Direct link to ShowActivityPanel") bool **ShowActivityPanel** `get` `set` *Show the Activity Panel. *(white-label grid only)** * Lua ```lua Space.UI.ShowActivityPanel = false ``` * Lua ```lua --This script will make a UI Toggle show/hide the Activity Panel --[You need to add an object with UI Toggle as a reference (scripting runtime)] toggle = Space.Host.GetReference("Toggle").UIToggle OnValueChanged = function() if toggle.IsOn then Space.UI.ShowActivityPanel= true else Space.UI.ShowActivityPanel= false end end toggle.OnValueChanged(OnValueChanged) ``` ##### ShowProfileImage[​](#showprofileimage "Direct link to ShowProfileImage") bool **ShowProfileImage** `get` `set` *Show the Profile Image. *(white-label grid only)** * Lua ```lua Space.UI.ShowProfileImage = false ``` * Lua ```lua --This script will make a UI Toggle show/hide the Profile Image --(example: tools for user to customize UI) --[You need to add an object with UI Toggle as a reference (scripting runtime)] toggle = Space.Host.GetReference("Toggle").UIToggle OnValueChanged = function() if toggle.IsOn then Space.UI.ShowProfileImage= true else Space.UI.ShowProfileImage= false end end toggle.OnValueChanged(OnValueChanged) ``` ##### ShowRightButtonGroup[​](#showrightbuttongroup "Direct link to ShowRightButtonGroup") bool **ShowRightButtonGroup** `get` `set` *Show the Right Button Group. *(white-label grid only)** * Lua ```lua Space.UI.ShowRightButtonGroup = false ``` * Lua ```lua --This script will make a UI Toggle show/hide the Right Button Group --(example: tools for user to customize UI) --[You need to add an object with UI Toggle as a reference (scripting runtime)] toggle = Space.Host.GetReference("Toggle").UIToggle OnValueChanged = function() if toggle.IsOn then Space.UI.ShowRightButtonGroup= true else Space.UI.ShowRightButtonGroup= false end end toggle.OnValueChanged(OnValueChanged) ``` ##### ShowRoomInfoOption[​](#showroominfooption "Direct link to ShowRoomInfoOption") bool **ShowRoomInfoOption** `get` `set` *Show the Room Info Option. *(white-label grid only)** * Lua ```lua Space.UI.ShowRoomInfoOption = false ``` * Lua ```lua --This script will make a UI Toggle show/hide the Room Info Option --[You need to add an object with UI Toggle as a reference (scripting runtime)] toggle = Space.Host.GetReference("Toggle").UIToggle OnValueChanged = function() if toggle.IsOn then Space.UI.ShowRoomInfoOption= true else Space.UI.ShowRoomInfoOption= false end end toggle.OnValueChanged(OnValueChanged) ``` ##### ShowSearch[​](#showsearch "Direct link to ShowSearch") bool **ShowSearch** `get` `set` *Show the Search bar. *(white-label grid only)** * Lua ```lua Space.UI.ShowSearch = false ``` * Lua ```lua --This script will make a UI Toggle show/hide the Search Bar --(example: tools for user to customize UI) --[You need to add an object with UI Toggle as a reference (scripting runtime)] toggle = Space.Host.GetReference("Toggle").UIToggle OnValueChanged = function() if toggle.IsOn then Space.UI.ShowSearch= true else Space.UI.ShowSearch= false end end toggle.OnValueChanged(OnValueChanged) ``` ##### ShowMailButton[​](#showmailbutton "Direct link to ShowMailButton") bool **ShowMailButton** `get` `set` *Show the Mail button. *(white-label grid only)** * Lua ```lua Space.UI.ShowMailButton = false ``` * Lua ```lua --This script will make a UI Toggle show/hide the Mail Button --(example: tools for user to customize UI) --[You need to add an object with UI Toggle as a reference (scripting runtime)] toggle = Space.Host.GetReference("Toggle").UIToggle OnValueChanged = function() if toggle.IsOn then Space.UI.ShowMailButton = true else Space.UI.ShowMailButton = false end end toggle.OnValueChanged(OnValueChanged) ``` ##### ShowNotificationButton[​](#shownotificationbutton "Direct link to ShowNotificationButton") bool **ShowNotificationButton** `get` `set` *Show the Notification button. *(white-label grid only)** * Lua ```lua Space.UI.ShowNotificationButton = false ``` * Lua ```lua --This script will make a UI Toggle show/hide the Notification Button --(example: tools for user to customize UI) --[You need to add an object with UI Toggle as a reference (scripting runtime)] toggle = Space.Host.GetReference("Toggle").UIToggle OnValueChanged = function() if toggle.IsOn then Space.UI.ShowNotificationButton= true else Space.UI.ShowNotificationButton= false end end toggle.OnValueChanged(OnValueChanged) ``` ##### ShowClock[​](#showclock "Direct link to ShowClock") bool **ShowClock** `get` `set` *Show the clock. *(white-label grid only)** * Lua ```lua Space.UI.ShowClock = false ``` * Lua ```lua --This script will make a UI Toggle show/hide the Clock --(example: tools for user to customize UI) --[You need to add an object with UI Toggle as a reference (scripting runtime)] toggle = Space.Host.GetReference("Toggle").UIToggle OnValueChanged = function() if toggle.IsOn then Space.UI.ShowClock= true else Space.UI.ShowClock= false end end toggle.OnValueChanged(OnValueChanged) ``` --- ### Components Components are the behaviours attached to scene objects. This section covers the full set client scripts can read and control β€” rendering, physics, audio, animation, UI, and interaction components. --- ### SAnimation #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | SAnimationState [**GetState** ](sanimation#getstate)()SAnimationState [**GetState** ](sanimation#getstate)(string state) | | void [**Blend** ](/scripting/client-scripting-api-reference/components/sanimation.md#blend)(string animation, float targetWeight=1.0F, float fadeLength=0.3F) | | void [**CrossFade** ](/scripting/client-scripting-api-reference/components/sanimation.md#crossfade)(string animation, float fadeLength=0.3F) | | SAnimationState [**CrossFadeQueued** ](/scripting/client-scripting-api-reference/components/sanimation.md#crossfadequeued)(string animation, float fadeLength=0.3F, bool playNow=false) | | int [**GetClipCount** ](/scripting/client-scripting-api-reference/components/sanimation.md#getclipcount)() | | bool [**IsPlaying** ](/scripting/client-scripting-api-reference/components/sanimation.md#isplaying)(string animation) | | bool [**Play** ](sanimation#play)()bool [**Play** ](sanimation#play)(string animation) | | SAnimationState [**PlayQueued** ](/scripting/client-scripting-api-reference/components/sanimation.md#playqueued)(string animation, bool playNow=false) | | void [**Rewind** ](/scripting/client-scripting-api-reference/components/sanimation.md#rewind)(string animation) | | void [**Sample** ](/scripting/client-scripting-api-reference/components/sanimation.md#sample)() | | void [**Stop** ](sanimation#stop)()void [**Stop** ](sanimation#stop)(string animation) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ------------------------------------------------------------------------------------------------------------------------------------ | | bool [**Enabled** ](/scripting/client-scripting-api-reference/components/sanimation.md#enabled)`get` `set` | | IDictionary< string, SAnimationState > [**States** ](/scripting/client-scripting-api-reference/components/sanimation.md#states)`get` | #### Functions[​](#functions "Direct link to Functions") ##### GetState[​](#getstate "Direct link to GetState") [SAnimationState](/scripting/client-scripting-api-reference/types/sanimationstate.md) **GetState** ()
[SAnimationState](/scripting/client-scripting-api-reference/types/sanimationstate.md) **GetState** (string state) *Returns the SAnimationState for the default animation clip.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua State = Space.Host.ExecutingObject.Animation.GetState() State = Space.Host.ExecutingObject.Animation.GetState("statename") ``` ##### Blend[​](#blend "Direct link to Blend") void **Blend** (string animation, float targetWeight=1.0F, float fadeLength=0.3F) *Blends the animation named animation towards targetWeight over the next time seconds. Playback of other animations will not be affected.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Animation.Blend("animationname",1.0,0.3) ``` ##### CrossFade[​](#crossfade "Direct link to CrossFade") void **CrossFade** (string animation, float fadeLength=0.3F) *Fades the animation with name animation in over a period of time seconds and fades other animations out.* *If mode is PlayMode.StopSameLayer, animations in the same layer as animation will be faded out while animation is faded in. if mode is PlayMode.StopAll, all animations will be faded out while animation is faded in.* *If the animation is not set to be looping it will be stopped and rewound after playing.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Animation.CrossFade("animationname", 0.3) ``` ##### CrossFadeQueued[​](#crossfadequeued "Direct link to CrossFadeQueued") [SAnimationState](/scripting/client-scripting-api-reference/types/sanimationstate.md) **CrossFadeQueued** (string animation, float fadeLength=0.3F, bool playNow=false) *Returns a duplicated SAnimationState. This duplicate will self-destruct after it is finished playing. Referencing it after it has completed will result in an error.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua NewSAnimationState = Space.Host.ExecutingObject.Animation.CrossFadeQueued("animationname", 0.3, false) ``` ##### GetClipCount[​](#getclipcount "Direct link to GetClipCount") int **GetClipCount** () *Get the number of clips currently assigned to this animation.* * Lua ```lua NumberOfClips = Space.Host.ExecutingObject.Animation.GetClipCount() ``` ##### IsPlaying[​](#isplaying "Direct link to IsPlaying") bool **IsPlaying** (string animation) *Is the animation named name playing?* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua IsPlaying = Space.Host.ExecutingObject.Animation.IsPlaying("animationname") ``` ##### Play[​](#play "Direct link to Play") bool **Play** () bool **Play** (string animation) *Plays an animation without any blending.* *If no name is supplied then the default animation will be played. In cases where the animation can't be played (ie, there is no default animation or no animation with the specified name), the function will return false.* *The optional playMode lets you choose how this animation will affect others already playing.* *If the specified animation is already playing then other animations will be stopped but the animation will not rewind to the beginning.* *When the end of the animation is reached it will automatically be stopped and rewound to the start unless the PlayMode is set to Loop.* *Note that if you call Animation.Play on an object during a frame update where the object is also deactivated then the call will effectively be cancelled; the animation will not start playing when the object is later reactivated. However, if you make the call on a subsequent frame (ie, while the object is still inactive) then the animation will start playing after reactivation.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Animation.Play() Space.Host.ExecutingObject.Animation.Play("animationname") ``` ##### PlayQueued[​](#playqueued "Direct link to PlayQueued") [SAnimationState](/scripting/client-scripting-api-reference/types/sanimationstate.md) **PlayQueued** (string animation, bool playNow=false) *Returns a duplicated SAnimationState. This duplicate will self-destruct after it is finished playing. Referencing it after it has completed will result in an error.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Animation.PlayQueued("animationname","false") ``` ##### Rewind[​](#rewind "Direct link to Rewind") void **Rewind** (string animation) *Rewinds the animation named name.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Animation.Rewind() ``` ##### Sample[​](#sample "Direct link to Sample") void **Sample** () *Samples animations at the current state.* *This is useful when you explicitly want to set up some animation state, and sample it once.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Animation.Sample() ``` ##### Stop[​](#stop "Direct link to Stop") void **Stop** ()
void **Stop** (string animation) *Stops all playing animations that were started with this Animation.* *Stopping an animation also Rewinds it to the Start.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Animation.Stop() Space.Host.ExecutingObject.Animation.Stop("animationname") ``` #### Properties[​](#properties "Direct link to Properties") ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` Whether this component is enabled or not. * Lua ```lua Space.Host.ExecutingObject.Animation.Enabled = false ``` * Lua ```lua --clicking this object will Enable/Disable it's Animation component thisGameObject = Space.Host.ExecutingObject animation = thisGameObject.Animation OnClick = function() animation.Enabled = not animation.Enabled end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### States[​](#states "Direct link to States") IDictionary< string, [SAnimationState](/scripting/client-scripting-api-reference/types/sanimationstate.md) > **States** `get` *Returns a table of* [*SAnimationState*](/scripting/client-scripting-api-reference/types/sanimationstate.md) *names and references* * Lua ```lua States = Space.Host.ExecutingObject.Animation.States ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Returns a reference to the GameObject of this component.* * Lua ```lua theGameObject = Space.Host.ExecutingObject.Animation.GameObject ``` --- ### SAnimator #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | void [**Rebind** ](/scripting/client-scripting-api-reference/components/sanimator.md#rebind)() | | void [**Stop** ](/scripting/client-scripting-api-reference/components/sanimator.md#stop)() | | void [**SetTime** ](/scripting/client-scripting-api-reference/components/sanimator.md#settime)(double time) | | double [**GetTime** ](/scripting/client-scripting-api-reference/components/sanimator.md#gettime)() | | double [**GetNormalizedTime** ](/scripting/client-scripting-api-reference/components/sanimator.md#getnormalizedtime)(int layer=0) | | double [**GetLength** ](/scripting/client-scripting-api-reference/components/sanimator.md#getlength)(int layer=0) | | bool [**GetLoop** ](/scripting/client-scripting-api-reference/components/sanimator.md#getloop)(int layer=0) | | float [**GetFloat** ](sanimator#getfloat)(string name)float [**GetFloat** ](sanimator#getfloat)(int id) | | bool [**GetBool** ](sanimator#getbool)(string name)bool [**GetBool** ](sanimator#getbool)(int id) | | int [**GetInteger** ](sanimator#getinteger)(string name)int [**GetInteger** ](sanimator#getinteger)(int id) | | void [**ResetTrigger** ](sanimator#resettrigger)(string name)void [**ResetTrigger** ](sanimator#resettrigger)(int id) | | bool [**IsParameterControlledByCurve** ](sanimator#isparametercontrolledbycurve)(string name)bool [**IsParameterControlledByCurve** ](sanimator#isparametercontrolledbycurve)(int id) | | string [**GetLayerName** ](/scripting/client-scripting-api-reference/components/sanimator.md#getlayername)(int layerIndex) | | int [**GetLayerIndex** ](/scripting/client-scripting-api-reference/components/sanimator.md#getlayerindex)(string layerName) | | float [**GetLayerWeight** ](/scripting/client-scripting-api-reference/components/sanimator.md#getlayerweight)(int layerIndex) | | void [**SetLayerWeight** ](/scripting/client-scripting-api-reference/components/sanimator.md#setlayerweight)(int layerIndex, float weight) | | bool [**IsInTransition** ](/scripting/client-scripting-api-reference/components/sanimator.md#isintransition)(int layerIndex) | | void [**CrossFadeInFixedTime** ](sanimator#crossfadeinfixedtime)(string stateName, float transitionDuration, int layer)void [**CrossFadeInFixedTime** ](sanimator#crossfadeinfixedtime)(string stateName, float transitionDuration)void [**CrossFadeInFixedTime** ](sanimator#crossfadeinfixedtime)(string stateName, float transitionDuration, int layer, float fixedTime) | | void [**CrossFade** ](sanimator#crossfade)(string stateName, float transitionDuration, int layer)void [**CrossFade** ](sanimator#crossfade)(string stateName, float transitionDuration)void [**CrossFade** ](sanimator#crossfade)(string stateName, float transitionDuration, int layer, float normalizedTime) | | void [**PlayInFixedTime** ](sanimator#playinfixedtime)(string stateName, int layer)void [**PlayInFixedTime** ](sanimator#playinfixedtime)(string stateName)void [**PlayInFixedTime** ](sanimator#playinfixedtime)(string stateName, int layer, float fixedTime) | | void [**Play** ](sanimator#play)(string stateName, int layer)void [**Play** ](sanimator#play)(string stateName)void [**Play** ](sanimator#play)(string stateName, int layer, float normalizedTime) | | void [**StartPlayback** ](/scripting/client-scripting-api-reference/components/sanimator.md#startplayback)() | | void [**StopPlayback** ](/scripting/client-scripting-api-reference/components/sanimator.md#stopplayback)() | | void [**StartRecording** ](/scripting/client-scripting-api-reference/components/sanimator.md#startrecording)() | | void [**StopRecording** ](/scripting/client-scripting-api-reference/components/sanimator.md#stoprecording)() | | void [**Update** ](/scripting/client-scripting-api-reference/components/sanimator.md#update)(float deltaTime) | | void [**SetTrigger** ](sanimator#settrigger)(string trigger)void [**SetTrigger** ](sanimator#settrigger)(int id) | | void [**SetFloat** ](sanimator#setfloat)(string name, float value, float dampTime, float deltaTime)void [**SetFloat** ](sanimator#setfloat)(int id, float value)void [**SetFloat** ](sanimator#setfloat)(int id, float value, float dampTime, float deltaTime)void [**SetFloat** ](sanimator#setfloat)(string name, float value) | | void [**SetBool** ](sanimator#setbool)(int id, bool value)void [**SetBool** ](sanimator#setbool)(string name, bool value) | | void [**SetInteger** ](sanimator#setinteger)(string name, int value)void [**SetInteger** ](sanimator#setinteger)(int id, int value) | | int [**StringToHash** ](/scripting/client-scripting-api-reference/components/sanimator.md#stringtohash)(string name) | | SAnimatorStateInfo [**GetCurrentAnimatorStateInfo** ](/scripting/client-scripting-api-reference/components/sanimator.md#getcurrentanimatorstateinfo)(int Layerindex) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ------------------------------------------------------------------------------------------------------------------------- | | SResource [**Controller** ](/scripting/client-scripting-api-reference/components/sanimator.md#controller)`get` `set` | | SResource [**Avatar** ](/scripting/client-scripting-api-reference/components/sanimator.md#avatar)`get` `set` | | bool [**ApplyRootMotion** ](/scripting/client-scripting-api-reference/components/sanimator.md#applyrootmotion)`get` `set` | | float [**PlaybackTime** ](/scripting/client-scripting-api-reference/components/sanimator.md#playbacktime)`get` `set` | | bool [**Enabled** ](/scripting/client-scripting-api-reference/components/sanimator.md#enabled)`get` `set` | | string\[] [**Parameters** ](/scripting/client-scripting-api-reference/components/sanimator.md#parameters)`get` | #### Functions[​](#functions "Direct link to Functions") ##### Rebind[​](#rebind "Direct link to Rebind") void **Rebind** () *Rebind all the animated properties and mesh data with the Animator.* * Lua ```lua Space.Host.ExecutingObject.Animator.Rebind() ``` ##### Stop[​](#stop "Direct link to Stop") void **Stop** () *Stop the Animator.* * Lua ```lua Space.Host.ExecutingObject.Animator.Stop() ``` ##### SetTime[​](#settime "Direct link to SetTime") void **SetTime** (double time) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Animator.SetTime(1.0) ``` ##### GetTime[​](#gettime "Direct link to GetTime") double **GetTime** () *Function Description* * Lua ```lua layerStateTime = Space.Host.ExecutingObject.Animator.GetTime(0) ``` ##### GetNormalizedTime[​](#getnormalizedtime "Direct link to GetNormalizedTime") double **GetNormalizedTime** (int layer=0) *Normalized time of the State. The integer part is the number of time a state has been looped. The fractional part is the % (0-1) of progress in the current loop.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua layerStateNormalizedTime = Space.Host.ExecutingObject.Animator.GetNormalizedTime(0) ``` ##### GetLength[​](#getlength "Direct link to GetLength") double **GetLength** (int layer=0) *Current duration of the state.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua layerStateLength = Space.Host.ExecutingObject.Animator.GetLength(1) ``` ##### GetLoop[​](#getloop "Direct link to GetLoop") bool **GetLoop** (int layer=0) *Is the state looping.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua layerStateLoop = Space.Host.ExecutingObject.Animator.GetLoop(0) ``` ##### GetFloat[​](#getfloat "Direct link to GetFloat") float **GetFloat** (string name)
float **GetFloat** (int id) *Returns the value of the given float parameter. name: The name of the parameter.* *id: The id of the parameter.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua getParam = Space.Host.ExecutingObject.Animator.GetFloat("paramName") -- or paramID = Space.Host.ExecutingObject.Animator.StringToHash("paramName") getParam = Space.Host.ExecutingObject.Animator.GetFloat(paramID) ``` * Lua ```lua --clicking the object will toggle it's Animator's "flySpeed" float parameter between 0.0 and 5.0 thisObject = Space.Host.ExecutingObject OnClick = function() if thisObject.Animator.GetFloat("flySpeed") == 0.0 then thisObject.Animator.SetFloat("flySpeed", 5.0) else thisObject.Animator.SetFloat("flySpeed", 0.0) end end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` * Lua ```lua --clicking the object will toggle it's Animator's "flySpeed" float parameter between 0.0 and 5.0 --this script uses parameter ID instead of string (StringToHash function gets the ID) thisObject = Space.Host.ExecutingObject paramID = thisObject.Animator.StringToHash("flySpeed") OnClick = function() if thisObject.Animator.GetFloat(paramID) == 0.0 then thisObject.Animator.SetFloat(paramID, 5.0) else thisObject.Animator.SetFloat(paramID, 0.0) end end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### GetBool[​](#getbool "Direct link to GetBool") bool **GetBool** (string name)
bool **GetBool** (int id) *Returns the value of the given boolean parameter. name: The name of the parameter.* *id: The id of the parameter.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua isFlying = Space.Host.ExecutingObject.Animator.GetBool("IsFlying") --or ID = Space.Host.ExecutingObject.Animator.StringToHash("isFlying") isFlying = Space.Host.ExecutingObject.Animator.GetBool(ID) ``` * Lua ```lua --clicking the object will toggle it's "isFlying" bool parameter between true and false thisObject = Space.Host.ExecutingObject OnClick = function() if thisObject.Animator.GetBool("isFlying") == true then thisObject.Animator.SetBool("isFlying", false) else thisObject.Animator.SetBool("isFlying", true) end end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` * Lua ```lua --clicking the object will toggle it's "isFlying" bool parameter between true and false --this script uses parameter ID instead of string (StringToHash function gets the ID) thisObject = Space.Host.ExecutingObject OnClick = function() parameterID = thisObject.Animator.StringToHash("isFlying") if thisObject.Animator.GetBool(parameterID) == true then thisObject.Animator.SetBool(parameterID, false) else thisObject.Animator.SetBool(parameterID, true) end end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### GetInteger[​](#getinteger "Direct link to GetInteger") int **GetInteger** (string name) int **GetInteger** (int id) *Returns the value of the given integer parameter. name: The name of the parameter.* *id: The id of the parameter.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua getParam = Space.Host.ExecutingObject.Animator.GetInteger("paramName") --or paramID = Space.Host.ExecutingObject.Animator.StringToHash("paramName") getParam = Space.Host.ExecutingObject.Animator.GetInteger(paramID) ``` * Lua ```lua --clicking the object will toggle it's Animator's "jumpHeight" int parameter between 0 and 5 thisObject = Space.Host.ExecutingObject OnClick = function() if thisObject.Animator.GetInteger("jumpHeight") == 0 then thisObject.Animator.SetInteger("jumpHeight", 1) else thisObject.Animator.SetInteger("jumpHeight", 0) end end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` * Lua ```lua --clicking the object will toggle it's Animator's "jumpHeight" int parameter between 0 and 5 --this script uses parameter ID instead of string (StringToHash function gets the ID) thisObject = Space.Host.ExecutingObject paramID = thisObject.Animator.StringToHash("jumpHeight") OnClick = function() if thisObject.Animator.GetInteger(paramID ) == 0 then thisObject.Animator.SetInteger(paramID , 1) else thisObject.Animator.SetInteger(paramID , 0) end end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### ResetTrigger[​](#resettrigger "Direct link to ResetTrigger") void **ResetTrigger** (string name) void **ResetTrigger** (int id) *Resets the trigger parameter to false.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Animator.ResetTrigger("parameterName") --or paramID = Space.Host.ExecutingObject.Animator.StringToHash("parameterName") Space.Host.ExecutingObject.Animator.ResetTrigger(paramID) ``` * Lua ```lua -- when object is clicked, "clickedTrigger" trigger parameter will be set and initial trigger cleared thisObject = Space.Host.ExecutingObject OnClick = function() thisObject.Animator.ResetTrigger("initialTrigger") thisObject.Animator.SetTrigger("clickedTrigger") end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` * Lua ```lua -- when object is clicked, "clickedTrigger" trigger parameter will be set and initial trigger cleared thisObject = Space.Host.ExecutingObject initialID = thisObject.Animator.StringToHash("initialTrigger") clickedID = thisObject.Animator.StringToHash("clickedTrigger") OnClick = function() thisObject.Animator.ResetTrigger(initialID) thisObject.Animator.SetTrigger(clickedID) end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### IsParameterControlledByCurve[​](#isparametercontrolledbycurve "Direct link to IsParameterControlledByCurve") bool **IsParameterControlledByCurve** (string name) bool **IsParameterControlledByCurve** (int id) *Returns true if a parameter is controlled by an additional curve on an animation.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua paramCurve = Space.Host.ExecutingObject.Animator.IsParameterControlledByCurve("parameterName") ``` ##### GetLayerName[​](#getlayername "Direct link to GetLayerName") string **GetLayerName** (int layerIndex) *Gets name of the layer.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua layerName = Space.Host.ExecutingObject.Animator.GetLayerName(1) ``` ##### GetLayerIndex[​](#getlayerindex "Direct link to GetLayerIndex") int **GetLayerIndex** (string layerName) *Gets the index of the layer with specified name.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua layerIndex = Space.Host.ExecutingObject.Animator.GetLayerIndex("Layer Name") ``` ##### GetLayerWeight[​](#getlayerweight "Direct link to GetLayerWeight") float **GetLayerWeight** (int layerIndex) *Gets the layer's current weight.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua layerIndex = Space.Host.ExecutingObject.Animator.GetLayerWeight("Layer Name") ``` ##### SetLayerWeight[​](#setlayerweight "Direct link to SetLayerWeight") void **SetLayerWeight** (int layerIndex, float weight) *Sets the weight of the layer at the given index.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Animator.SetLayerWeight(0,2.0) ``` * Lua ```lua --clicking the object will toggle the Layer Weight of your second layer (index 1) between 0.0 and 1.0 thisObject = Space.Host.ExecutingObject OnClick = function() if thisObject.Animator.GetLayerWeight(1) == 0 then thisObject.Animator.SetLayerWeight(1, 1.0) else thisObject.Animator.SetLayerWeight(1, 0.0) end end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### IsInTransition[​](#isintransition "Direct link to IsInTransition") bool **IsInTransition** (int layerIndex) *Is the specified layer in a transition.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua layerTransition = Space.Host.ExecutingObject.Animator.IsInTransition(0) ``` ##### CrossFadeInFixedTime[​](#crossfadeinfixedtime "Direct link to CrossFadeInFixedTime") void **CrossFadeInFixedTime** (string stateName, float transitionDuration) void **CrossFadeInFixedTime** (string stateName, float transitionDuration, int layer) void **CrossFadeInFixedTime** (string stateName, float transitionDuration, int layer, float fixedTime) *Creates a dynamic transition between the current state and the destination state. The duration and offset in the target state are in fixed time. stateName: The name of the destination state. transitionDuration: The duration of the transition. Value is in seconds. layer: Layer index containing the destination state. If no layer is specified or layer is -1, the first state that is found with the given name or hash will be played. fixedTime: Start time of the current destination state. Value is in seconds. If no explicit fixedTime is specified or fixedTime value is float.NegativeInfinity, the state will either be played from the start if it's not already playing, or will continue playing from its current time and no transition will happen.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Animator.CrossFadeInFixedTime("State Name", 15.0) Space.Host.ExecutingObject.Animator.CrossFadeInFixedTime("State Name", 15.0, 0) Space.Host.ExecutingObject.Animator.CrossFadeInFixedTime("State Name", 15.0, 0 , 0.0) ``` * Lua ```lua --clicking the object will make it's animator crossfade from current state to the middle of "Second State" (on the second layer) in 3 seconds thisObject = Space.Host.ExecutingObject OnClick = function() thisObject.Animator.CrossFadeInFixedTime("Second State", 3.0, 1, 0.5) end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### CrossFade[​](#crossfade "Direct link to CrossFade") void **CrossFade** (string stateName, float transitionDuration) void **CrossFade** (string stateName, float transitionDuration, int layer) void **CrossFade** (string stateName, float transitionDuration, int layer, float normalizedTime) *Creates a dynamic transition between the current state and the destination state. stateName: The name of the destination state. transitionDuration: The duration of the transition. Value is in source state normalized time. layer: Layer index containing the destination state. If no layer is specified or layer is -1, the first state that is found with the given name or hash will be played. normalizedTime: Start time of the current destination state. Value is in source state normalized time, should be between 0 and 1. If no explicit normalizedTime is specified or normalizedTime value is float.NegativeInfinity, the state will either be played from the start if it's not already playing, or will continue playing from its current time and no transition will happen.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | | | | | | | | | | | | | * Lua ```lua Space.Host.ExecutingObject.Animator.CrossFade("State Name", 3.0) Space.Host.ExecutingObject.Animator.CrossFade("State Name", 3.0, 0) Space.Host.ExecutingObject.Animator.CrossFade("State Name", 3.0, 0 , 0.0) ``` * Lua ```lua --clicking the object will make it's animator crossfade from current state to the middle of "Second State" (on the second layer) --Crossfade duration will be triple the length of Source state thisObject = Space.Host.ExecutingObject OnClick = function() thisObject.Animator.CrossFade("Second State", 3.0, 1, 0.5) end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### PlayInFixedTime[​](#playinfixedtime "Direct link to PlayInFixedTime") void **PlayInFixedTime** (string stateName, int layer) void **PlayInFixedTime** (string stateName) void **PlayInFixedTime** (string stateName, int layer, float fixedTime) *Plays a state. The offset in the target state is in fixed time. stateName: The name of the state to play. Layer index containing the destination state. If no layer is specified or layer is -1, the first state that is found with the given name or hash will be played.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Animator.PlayInFixedTime("State Name") Space.Host.ExecutingObject.Animator.PlayInFixedTime("State Name", 0) Space.Host.ExecutingObject.Animator.PlayInFixedTime("State Name", 0, 0.0) ``` * Lua ```lua --clicking the object will make it's animator play the "Second State", on the second Layer, and starting half a second in thisObject = Space.Host.ExecutingObject OnClick = function() thisObject.Animator.PlayInFixedTime("Second State",1,0.5) --add "Second State" to the second Layer in Animator Controller end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### Play[​](#play "Direct link to Play") void **Play** (string stateName) void **Play** (string stateName, int layer) void **Play** (string stateName, int layer, float normalizedTime) *Plays a state.* | Parameter | Type | Description | | -------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | stateName | string | The name of the state to play. | | layer | int | Layer index containing the destination state. If no layer is specified or layer is -1, the first state that is found with the given name or hash will be played. | | normalizedTime | float | Start time of the current destination state. Value is in normalized time. If no explicit normalizedTime is specified or value is float.NegativeInfinity, the state will either be played from the start if it's not already playing, or will continue playing from its current time. | * Lua ```lua Space.Host.ExecutingObject.Animator.Play("Run") Space.Host.ExecutingObject.Animator.Play("Run", 0) Space.Host.ExecutingObject.Animator.Play("Run", 0, 0.5) ``` ##### StartPlayback[​](#startplayback "Direct link to StartPlayback") void **StartPlayback** () *Sets the animator in playback mode.* * Lua ```lua Space.Host.ExecutingObject.Animator.StartPlayback() ``` ##### StopPlayback[​](#stopplayback "Direct link to StopPlayback") void **StopPlayback** () *Stops the animator playback mode. When playback stops, the avatar resumes getting control from game logic.* * Lua ```lua Space.Host.ExecutingObject.Animator.StopPlayback() ``` ##### StartRecording[​](#startrecording "Direct link to StartRecording") void **StartRecording** () *Sets the animator in recording mode. The recording will continue until the user calls StopRecording. Maximum 10,000 frames. Note it is not possible to start playback until a call to StopRecording is made* * Lua ```lua Space.Host.ExecutingObject.Animator.StartRecording() ``` ##### StopRecording[​](#stoprecording "Direct link to StopRecording") void **StopRecording** () *Stops animator record mode.* * Lua ```lua Space.Host.ExecutingObject.Animator.StopRecording() ``` ##### Update[​](#update "Direct link to Update") void **Update** (float deltaTime) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Animator.Update() ``` ##### SetTrigger[​](#settrigger "Direct link to SetTrigger") void **SetTrigger** (string trigger) void **SetTrigger** (int id) *Sets a trigger parameter to active. A trigger parameter is a bool parameter that gets reset to false when it has been used in a transition. For state machines with multiple layers, the trigger will only get reset once all layers have been evaluated, so that the layers can synchronize their transitions on the same parameter.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.SetTrigger("TheTriggerName") --or paramID = Space.Host.ExecutingObject.Animator.StringToHash("TheTriggerName") Space.Host.ExecutingObject.SetTrigger(paramID) ``` ##### SetFloat[​](#setfloat "Direct link to SetFloat") void **SetFloat** (string name, float value) void **SetFloat** (string name, float value, float dampTime, float deltaTime) void **SetFloat** (int id, float value) void **SetFloat** (int id, float value, float dampTime, float deltaTime) *Send float values to the Animator to affect transitions. dampTime: The damper total time. deltaTime: The delta time to give to the damper.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | | | | | * Lua ```lua Space.Host.ExecutingObject.Animator.SetFloat("parameterName", 2.2) --or Space.Host.ExecutingObject.Animator.SetFloat("parameterName", 2.2,2.0,Space.DeltaTime) --or paramID = Space.Host.ExecutingObject.Animator.StringToHash("parameterName") Space.Host.ExecutingObject.Animator.SetFloat(paramID, 2.2) --or paramID = Space.Host.ExecutingObject.Animator.StringToHash("parameterName") Space.Host.ExecutingObject.Animator.SetFloat(paramID, 2.2,2.0,Space.DeltaTime) ``` * Lua ```lua --clicking the object will make it's Animator damp transition it's "danceSpeed" property from 0.0 to 5.0 thisObject = Space.Host.ExecutingObject OnClick = function() Space.Host.StartCoroutine(function() while thisObject.Animator.GetFloat("danceSpeed") < 5.0 do thisObject.Animator.SetFloat("danceSpeed", 5.0, 1.0, Space.DeltaTime) coroutine.yield(0) end end) end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### SetBool[​](#setbool "Direct link to SetBool") void **SetBool** (int id, bool value) void **SetBool** (string name, bool value) *Sets the value of a boolean parameter.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Animator.SetBool("IsFlying", true) --or paramID = Space.Host.ExecutingObject.Animator.StringToHash("parameterName") Space.Host.ExecutingObject.Animator.SetFloat(paramID, 2.2) ``` * Lua ```lua --clicking the object will toggle it's "isFlying" bool parameter between true and false thisObject = Space.Host.ExecutingObject OnClick = function() if thisObject.Animator.GetBool("isFlying") == true then thisObject.Animator.SetBool("isFlying", false) else thisObject.Animator.SetBool("isFlying", true) end end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### SetInteger[​](#setinteger "Direct link to SetInteger") void **SetInteger** (string name, int value) void **SetInteger** (int id, int value) *Sets the value of the given integer parameter.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Animator.SetInteger("iParam", 2) --or paramID = Space.Host.ExecutingObject.Animator.StringToHash("iParam") Space.Host.ExecutingObject.Animator.SetInteger(paramID, 2) ``` * Lua ```lua --clicking the object will toggle it's Animator's "jumpHeight" int parameter between 0 and 5 thisObject = Space.Host.ExecutingObject OnClick = function() if thisObject.Animator.GetInteger("jumpHeight") == 0 then thisObject.Animator.SetInteger("jumpHeight", 1) else thisObject.Animator.SetInteger("jumpHeight", 0) end end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### StringToHash[​](#stringtohash "Direct link to StringToHash") int **StringToHash** (string name) *Generates an parameter id from a string. Ids are used for optimized setters and getters on parameters.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua ID = Space.Host.ExecutingObject.Animator.StringToHash("isFlying") ``` * Lua ```lua --clicking the object will toggle it's "isFlying" bool parameter between true and false --this script uses parameter ID instead of string (StringToHash function gets the ID) thisObject = Space.Host.ExecutingObject OnClick = function() parameterID = thisObject.Animator.StringToHash("isFlying") if thisObject.Animator.GetBool(parameterID) == true then thisObject.Animator.SetBool(parameterID, false) else thisObject.Animator.SetBool(parameterID, true) end end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### GetCurrentAnimatorStateInfo[​](#getcurrentanimatorstateinfo "Direct link to GetCurrentAnimatorStateInfo") [SAnimatorStateInfo](/scripting/client-scripting-api-reference/types/sanimatorstateinfo.md) **GetCurrentAnimatorStateInfo** (int Layerindex) *Returns an SAnimatorStateInfo with the information on the current state..* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Animator.GetCurrentAnimationStateInfo(0) ``` #### Properties[​](#properties "Direct link to Properties") ##### Controller[​](#controller "Direct link to Controller") [SResource](/scripting/client-scripting-api-reference/types/sresource.md) **Controller** `get` `set` *The Animator Controller resource of this Animator* * Lua ```lua Space.Host.ExecutingObject.Animator.Controller = Space.GetResource("newController") ``` ##### Avatar[​](#avatar "Direct link to Avatar") [SResource](/scripting/client-scripting-api-reference/types/sresource.md) **Avatar** `get` `set` *Gets/Sets the current Avatar.* * Lua ```lua currentAvatar = thisObject.Animator.Avatar ``` * Lua ```lua -- when object is clicked, it's Animator's Avatar will be changed to an alternate one thisObject = Space.Host.ExecutingObject alternateAvatar = Space.GetResource("altavatar") -- add Avatar to Scripting Runtime resources section OnClick = function() thisObject.Animator.Avatar = alternateAvatar end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### ApplyRootMotion[​](#applyrootmotion "Direct link to ApplyRootMotion") bool **ApplyRootMotion** `get` `set` *Should root motion be applied?* *Root motion is the effect where an object's entire mesh moves away from its starting point but that motion is created by the animation itself rather than by changing the Transform position.* * Lua ```lua Space.Host.ExecutingObject.Animator.ApplyRootMotion = true ``` * Lua ```lua --clicking this object will Enable/Disable it's Root Motion thisGameObject = Space.Host.ExecutingObject.Animator OnClick = function() animator.ApplyRootMotion = not animator.ApplyRootMotion end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### PlaybackTime[​](#playbacktime "Direct link to PlaybackTime") float **PlaybackTime** `get` `set` *Property Description* * Lua ```lua pace.Host.ExecutingObject.Animator.PlaybackTime = 0.5 ``` ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` *Whether the Animator component is enabled or not* * Lua ```lua Space.Host.ExecutingObject.Animator.Enabled = true ``` * Lua ```lua --clicking this object will Enable/Disable it's Animator component thisGameObject = Space.Host.ExecutingObject animator = thisGameObject.Animator OnClick = function() animator.Enabled = not animator.Enabled end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### Parameters[​](#parameters "Direct link to Parameters") string\[] **Parameters** `get` *The AnimatorControllerParameter list used by the animator.* * Lua ```lua parameters = Space.Host.ExecutingObject.Animator.Parameters for i=1,#parameters do Space.Log(parameters[i]) end --prints all parameters ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Returns a reference to the GameObject of this component.* * Lua ```lua theGameObject = Space.Host.ExecutingObject.Animator.GameObject ``` --- ### SAudioReactiveAnimation #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | bool [**Enabled** ](/scripting/client-scripting-api-reference/components/saudioreactiveanimation.md#enabled)`get` `set` | | [SAnimator](/scripting/client-scripting-api-reference/components/sanimator.md) [**Target** ](/scripting/client-scripting-api-reference/components/saudioreactiveanimation.md#target)`get` `set` | | string [**Parameter** ](/scripting/client-scripting-api-reference/components/saudioreactiveanimation.md#parameter)`get` `set` | #### Properties[​](#properties "Direct link to Properties") ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` *Returns true if the Audio Reactive Animation Enabled.* * Lua ```lua Space.Host.ExecutingObject.AudioReactiveAnimation.Enabled = false ``` * Lua ```lua --clicking this object will Enable/Disable it's Audio Reactive Animation component thisGameObject = Space.Host.ExecutingObject component = thisGameObject.AudioReactiveAnimation OnClick = function() component.Enabled = not component.Enabled end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### Target[​](#target "Direct link to Target") [SAnimator](/scripting/client-scripting-api-reference/components/sanimator.md) **Target** `get` `set` *The target Animator which the Audio Reactive Animation is affecting.* * Lua ```lua TargetAnimator = Space.Host.ExecutingObject.AudioReactiveAnimation.Target ``` * Lua ```lua --clicking this object toggles between two Audio Reactive Animation targets thisObject = Space.Host.ExecutingObject animator1 = Space.Host.GetReference("object1").Animator --add this reference to Scripting Runtime component animator2 = Space.Host.GetReference("object2").Animator --add this reference to Scripting Runtime component OnClick = function() if thisObject.AudioReactiveAnimation.Target == animator1 then thisObject.AudioReactiveAnimation.Target = animator2 else thisObject.AudioReactiveAnimation.Target = animator1 end end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### Parameter[​](#parameter "Direct link to Parameter") string **Parameter** `get` `set` *The Parameter value which the Audio Reactive Animation is affecting in the target Animator.* * Lua ```lua Space.Host.ExecutingObject.SAudioReactiveAnimation.Parameter = "param2" ``` * Lua ```lua --clicking this object toggles between two Audio Reactive Animation parameters thisObject = Space.Host.ExecutingObject parameter1 = "theParamName" parameter2 = "theParamName2" OnClick = function() if thisObject.AudioReactiveAnimation.Parameter == parameter1 then thisObject.AudioReactiveAnimation.Parameter = parameter2 else thisObject.AudioReactiveAnimation.Parameter = parameter1 end end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Returns a reference to the GameObject of this component.* * Lua ```lua theGameObject = Space.Host.ExecutingObject.AudioReactiveAnimation.GameObject ``` --- ### SAudioReactiveBase #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ------------------------------------------------------------------------------------------------------------------------------- | | bool [**Enabled** ](/scripting/client-scripting-api-reference/components/saudioreactivebase.md#enabled)`get` `set` | | int [**BandMin** ](/scripting/client-scripting-api-reference/components/saudioreactivebase.md#bandmin)`get` `set` | | int [**BandMax** ](/scripting/client-scripting-api-reference/components/saudioreactivebase.md#bandmax)`get` `set` | | float [**BPMWindow** ](/scripting/client-scripting-api-reference/components/saudioreactivebase.md#bpmwindow)`get` `set` | | float [**LimitIncrease** ](/scripting/client-scripting-api-reference/components/saudioreactivebase.md#limitincrease)`get` `set` | | float [**LimitDecrease** ](/scripting/client-scripting-api-reference/components/saudioreactivebase.md#limitdecrease)`get` `set` | | float [**MinValue** ](/scripting/client-scripting-api-reference/components/saudioreactivebase.md#minvalue)`get` `set` | | float [**MaxValue** ](/scripting/client-scripting-api-reference/components/saudioreactivebase.md#maxvalue)`get` `set` | | int [**Mode** ](/scripting/client-scripting-api-reference/components/saudioreactivebase.md#mode)`get` `set` | | virtual float [**Power** ](/scripting/client-scripting-api-reference/components/saudioreactivebase.md#power)`get` | #### Properties[​](#properties "Direct link to Properties") ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` *Whether the Audio Reactive component is enabled or not.* * Lua ```lua Space.Host.ExecutingObject.AudioReactive.Enabled = false ``` * Lua ```lua --clicking this object will Enable/Disable it's Audio Reactive Base component thisGameObject = Space.Host.ExecutingObject component = thisGameObject.AudioReactive OnClick = function() component.Enabled = not component.Enabled end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### BandMin[​](#bandmin "Direct link to BandMin") int **BandMin** `get` `set` *The Band Min property of an Audio Reactive component.* * Lua ```lua Space.Host.ExecutingObject.AudioReactive.BandMin= 1 ``` * Lua ```lua --the below script will make a slider change an Audio Reactive Component's Band Min property --[Add "theslider" and "theaudioreactive" reference to the Scripting Runtime component] slider = Space.Host.GetReference("theslider").UISlider ar = Space.Host.GetReference("theaudioreactive").AudioReactive OVC = function() ar.BandMin = (slider.Value * 12.0) -- from 0 to 12 end slider.OnValueChanged(OVC) ``` ##### BandMax[​](#bandmax "Direct link to BandMax") int **BandMax** `get` `set` *The Band Max property of an Audio Reactive component.* * Lua ```lua Space.Host.ExecutingObject.AudioReactive.BandMax= 11 ``` * Lua ```lua --the below script will make a slider change an Audio Reactive Component's Band Max property --[Add "theslider" and "theaudioreactive" reference to the Scripting Runtime component] slider = Space.Host.GetReference("theslider").UISlider ar = Space.Host.GetReference("theaudioreactive").AudioReactive OVC = function() ar.BandMax = (slider.Value * 12.0) -- from 0 to 12 end slider.OnValueChanged(OVC) ``` ##### BPMWindow[​](#bpmwindow "Direct link to BPMWindow") float **BPMWindow** `get` `set` *The BPM Window property of an Audio Reactive component.* * Lua ```lua Space.Host.ExecutingObject.AudioReactive.BPMWindow= 5 ``` * Lua ```lua --the below script will make a slider change an Audio Reactive Component's BPM Window property --[Add "theslider" and "theaudioreactive" reference to the Scripting Runtime component] slider = Space.Host.GetReference("theslider").UISlider ar = Space.Host.GetReference("theaudioreactive").AudioReactive OVC = function() ar.BPMWindow = (slider.Value * 50) - 50 -- from -50 to 50 end slider.OnValueChanged(OVC) ``` ##### LimitIncrease[​](#limitincrease "Direct link to LimitIncrease") float **LimitIncrease** `get` `set` *The Limit Increase property of an Audio Reactive component.* * Lua ```lua Space.Host.ExecutingObject.AudioReactive.LimitIncrease= 1 ``` * Lua ```lua --the below script will make a slider change an Audio Reactive Component's Limit Increase property. --[Add "theslider" and "theaudioreactive" reference to the Scripting Runtime component] slider = Space.Host.GetReference("theslider").UISlider ar = Space.Host.GetReference("theaudioreactive").AudioReactive OVC = function() ar.LimitIncrease= (slider.Value * 50) - 50 -- from -50 to 50 end slider.OnValueChanged(OVC) ``` ##### LimitDecrease[​](#limitdecrease "Direct link to LimitDecrease") float **LimitDecrease** `get` `set` *The Limit Decrease property of an Audio Reactive component.* * Lua ```lua Space.Host.ExecutingObject.AudioReactive.LimitDecrease= 3 ``` * Lua ```lua --the below script will make a slider change an Audio Reactive Component's Limit Decrease property. --[Add "theslider" and "theaudioreactive" reference to the Scripting Runtime component] slider = Space.Host.GetReference("theslider").UISlider ar = Space.Host.GetReference("theaudioreactive").AudioReactive OVC = function() ar.LimitDecrease= (slider.Value * 50) - 50 -- from -50 to 50 end slider.OnValueChanged(OVC) ``` ##### MinValue[​](#minvalue "Direct link to MinValue") float **MinValue** `get` `set` *The Min Value property of an Audio Reactive component.* * Lua ```lua Space.Host.ExecutingObject.AudioReactive.MinValue= 1 ``` * Lua ```lua --the below script will make a slider change an Audio Reactive Component's Min Value property. --[Add "theslider" and "theaudioreactive" reference to the Scripting Runtime component] slider = Space.Host.GetReference("theslider").UISlider ar = Space.Host.GetReference("theaudioreactive").AudioReactive OVC = function() ar.MinValue= (slider.Value * 50) - 50 -- from -50 to 50 end slider.OnValueChanged(OVC) ``` ##### MaxValue[​](#maxvalue "Direct link to MaxValue") float **MaxValue** `get` `set` *The Max Value property of an Audio Reactive component.* * Lua ```lua Space.Host.ExecutingObject.AudioReactive.MaxValue= 3 ``` * Lua ```lua --the below script will make a slider change an Audio Reactive Component's Max Value property. --[Add "theslider" and "theaudioreactive" reference to the Scripting Runtime component] slider = Space.Host.GetReference("theslider").UISlider ar = Space.Host.GetReference("theaudioreactive").AudioReactive OVC = function() ar.MaxValue= (slider.Value * 50) - 50 -- from -50 to 50 end slider.OnValueChanged(OVC) ``` ##### Mode[​](#mode "Direct link to Mode") int **Mode** `get` `set` *The Mode property of an Audio Reactive component. Band is 0, and BMP is 1.* * Lua ```lua Space.Host.ExecutingObject.AudioReactive.Mode= 1 ``` * Lua ```lua --clicking this object will toggle between it's two Audio Reactive Modes thisGameObject = Space.Host.ExecutingObject component = thisGameObject.AudioReactive OnClick = function() if component.Mode == 0 then component.Mode = 1 else component.Mode = 0 end end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### Power[​](#power "Direct link to Power") float **Power** `get` *Property Description* * Lua ```lua Space.Host.ExecutingObject.AudioReactive.Power = 1 ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Returns a reference to the GameObject of this component.* * Lua ```lua theGameObject = Space.Host.ExecutingObject.AudioReactive.GameObject ``` --- ### SAudioReactiveLight #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ------------------------------------------------------------------------------------------------------------------------------ | | bool [**Enabled** ](/scripting/client-scripting-api-reference/components/saudioreactivelight.md#enabled)`get` `set` | | SLight [**Target** ](/scripting/client-scripting-api-reference/components/saudioreactivelight.md#target)`get` `set` | | bool [**Range** ](/scripting/client-scripting-api-reference/components/saudioreactivelight.md#range)`get` `set` | | float [**MinRange** ](/scripting/client-scripting-api-reference/components/saudioreactivelight.md#minrange)`get` `set` | | float [**MaxRange** ](/scripting/client-scripting-api-reference/components/saudioreactivelight.md#maxrange)`get` `set` | | bool [**AnimateColor** ](/scripting/client-scripting-api-reference/components/saudioreactivelight.md#animatecolor)`get` `set` | | SColor [**MinColor** ](/scripting/client-scripting-api-reference/components/saudioreactivelight.md#mincolor)`get` `set` | | SColor [**MaxColor** ](/scripting/client-scripting-api-reference/components/saudioreactivelight.md#maxcolor)`get` `set` | | bool [**Intensity** ](/scripting/client-scripting-api-reference/components/saudioreactivelight.md#intensity)`get` `set` | | float [**MinIntensity** ](/scripting/client-scripting-api-reference/components/saudioreactivelight.md#minintensity)`get` `set` | | float [**MaxIntensity** ](/scripting/client-scripting-api-reference/components/saudioreactivelight.md#maxintensity)`get` `set` | #### Properties[​](#properties "Direct link to Properties") ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` *Returns true if the Audio Reactive Light Enabled.* * Lua ```lua Space.Host.ExecutingObject.AudioReactiveLight.Enabled = true ``` * Lua ```lua --clicking this object will Enable/Disable it's Audio Reactive Light component thisGameObject = Space.Host.ExecutingObject component = thisGameObject.AudioReactiveLight OnClick = function() component.Enabled = not component.Enabled end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### Target[​](#target "Direct link to Target") SLight **Target** `get` `set` *Returns true if the light target Enabled.* * Lua ```lua Space.Host.ExecutingObject.AudioReactiveLight.Target = false ``` * Lua ```lua --clicking the object will toggle between two different AudioReactiveLight targets --[Add "light1" and "light2" reference to the Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject light1 = Space.Host.GetReference("light1").Light light2 = Space.Host.GetReference("light2").Light OnClick = function() if thisGameObject.AudioReactiveLight.Target == light1 then thisGameObject.AudioReactiveLight.Target = light2 else thisGameObject.AudioReactiveLight.Target = light1 end end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### Range[​](#range "Direct link to Range") bool **Range** `get` `set` *Returns true if Range Enabled.* * Lua ```lua Space.Host.ExecutingObject.AudioReactiveLight.Range = false ``` * Lua ```lua --the below script will make the object toggle it's AudioReactiveLight's Range property --[Add "arlight" reference to the Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject arlight = Space.Host.GetReference("arlight").AudioReactiveLight OnClick = function() arlight.Range= not arlight.Range end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### MinRange[​](#minrange "Direct link to MinRange") float **MinRange** `get` `set` *Returns MinRange value of the Audio Reactive Light.* * Lua ```lua Space.Host.ExecutingObject.AudioReactiveLight.MinRange = 0.5 ``` * Lua ```lua --the below script will make a slider set the Audio Reactive Light's MinRange --[Add "slider" and "arlight" references to the Scripting Runtime component] arlight = Space.Host.GetReference("arlight").AudioReactiveLight slider = Space.Host.GetReference("slider").UISlider OVC = function() arlight.MinRange = (slider.Value * 9) + 1 --(from 1 to 10) end slider.OnValueChanged(OVC) ``` ##### MaxRange[​](#maxrange "Direct link to MaxRange") float **MaxRange** `get` `set` *Returns MaxRange value of the Audio Reactive Light.* * Lua ```lua Space.Host.ExecutingObject.AudioReactiveLight.MaxRange = 1 ``` * Lua ```lua --the below script will make a slider set the Audio Reactive Light's MaxRange --[Add "slider" and "arlight" references to the Scripting Runtime component] arlight = Space.Host.GetReference("arlight").AudioReactiveLight slider = Space.Host.GetReference("slider").UISlider OVC = function() arlight.MaxRange= (slider.Value * 10) + 10 --(from 10 to 20) end slider.OnValueChanged(OVC) ``` ##### AnimateColor[​](#animatecolor "Direct link to AnimateColor") bool **AnimateColor** `get` `set` *Returns true if AnimateColor Enabled.* * Lua ```lua Space.Host.ExecutingObject.AudioReactiveLight.AnimateColor = false ``` * Lua ```lua --the below script will make the object Enable/Disable it's AudioReactiveLight's AnimateColor property --[Add "arlight" reference to the Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject arlight = Space.Host.GetReference("arlight").AudioReactiveLight OnClick = function() arlight.AnimateColor = not arlight.AnimateColor end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### MinColor[​](#mincolor "Direct link to MinColor") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **MinColor** `get` `set` *Returns MinColor value of the Audio Reactive Light.* * Lua ```lua Space.Host.ExecutingObject.AudioReactiveLight.MinColor = Color.Red ``` * Lua ```lua --clicking the object will open a color picker that changes AudioReactiveLight's MinColor --[Add "arlight" reference to the Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject arlight = Space.Host.GetReference("arlight").AudioReactiveLight originalColor = nil OnChange = function(SColor) arlight.MinColor = SColor end OnSelect = function(SColor) arlight.MinColor = SColor end OnCancel = function() arlight.MinColor = originalColor end OnClick = function() originalColor = arlight.MinColor Space.Dialogues.ColorPicker("Pick a color","Ok", OnChange, OnSelect, OnCancel, originalColor) end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### MaxColor[​](#maxcolor "Direct link to MaxColor") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **MaxColor** `get` `set` *Returns MaxColor value of the Audio Reactive Light.* * Lua ```lua Space.Host.ExecutingObject.AudioReactiveLight.MaxColor = Color.Blue ``` * Lua ```lua --clicking the object will open a color picker that changes AudioReactiveLight's MaxColor --[Add "arlight" reference to the Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject arlight = Space.Host.GetReference("arlight").AudioReactiveLight originalColor = nil OnChange = function(SColor) arlight.MaxColor= SColor end OnSelect = function(SColor) arlight.MaxColor= SColor end OnCancel = function() arlight.MaxColor= originalColor end OnClick = function() originalColor = arlight.MaxColor Space.Dialogues.ColorPicker("Pick a color","Ok", OnChange, OnSelect, OnCancel, originalColor) end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### Intensity[​](#intensity "Direct link to Intensity") bool **Intensity** `get` `set` *Returns true if Intensity Enabled.* * Lua ```lua Space.Host.ExecutingObject.AudioReactiveLight.Intensity = false ``` * Lua ```lua --the below script will make the object Enable/Disable it's AudioReactiveLight's Intensity property --[Add "arlight" reference to the Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject arlight = Space.Host.GetReference("arlight").AudioReactiveLight OnClick = function() arlight.Intensity = not arlight.Intensity end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### MinIntensity[​](#minintensity "Direct link to MinIntensity") float **MinIntensity** `get` `set` *Returns MinIntensity value of the Audio Reactive Light.* * Lua ```lua Space.Host.ExecutingObject.AudioReactiveLight.MinIntensity = 0.2 ``` * Lua ```lua --the below script will make a slider set the Audio Reactive Light's MinIntensity --[Add "slider" and "arlight" references to the Scripting Runtime component] arlight = Space.Host.GetReference("arlight").AudioReactiveLight slider = Space.Host.GetReference("slider").UISlider OVC = function() arlight.MinIntensity= (slider.Value * 1) --(from 0 to 1) end slider.OnValueChanged(OVC) ``` ##### MaxIntensity[​](#maxintensity "Direct link to MaxIntensity") float **MaxIntensity** `get` `set` *Returns MaxIntensity value of the Audio Reactive Light.* * Lua ```lua Space.Host.ExecutingObject.AudioReactiveLight.MaxIntensity = 0.8 ``` * Lua ```lua --the below script will make a slider set the Audio Reactive Light's MaxIntensity --[Add "slider" and "arlight" references to the Scripting Runtime component] arlight = Space.Host.GetReference("arlight").AudioReactiveLight slider = Space.Host.GetReference("slider").UISlider OVC = function() arlight.MaxIntensity= (slider.Value * 2) + 1 --(from 1 to 3) end slider.OnValueChanged(OVC) ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Returns a reference to the GameObject of this component.* * Lua ```lua theGameObject = Space.Host.ExecutingObject.AudioReactiveLight.GameObject ``` --- ### SAudioReactiveMaterial #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | --------------------------------------------------------------------------------------------------------------------------------------------- | | bool [**Enabled** ](/scripting/client-scripting-api-reference/components/saudioreactivematerial.md#enabled)`get` `set` | | SMaterial [**Target** ](/scripting/client-scripting-api-reference/components/saudioreactivematerial.md#target)`get` `set` | | SMaterial [**OriginalMaterial** ](/scripting/client-scripting-api-reference/components/saudioreactivematerial.md#originalmaterial)`get` `set` | | SMaterial [**TargetMaterial** ](/scripting/client-scripting-api-reference/components/saudioreactivematerial.md#targetmaterial)`get` `set` | #### Properties[​](#properties "Direct link to Properties") ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` *Returns true if the Audio Reactive Material Enabled.* * Lua ```lua Space.Host.ExecutingObject.AudioReactiveMaterial.Enabled = false ``` * Lua ```lua --clicking this object will Enable/Disable it's Audio Reactive Material component thisGameObject = Space.Host.ExecutingObject component = thisGameObject.AudioReactiveMaterial OnClick = function() component.Enabled = not component.Enabled end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### Target[​](#target "Direct link to Target") [SMaterial](/scripting/client-scripting-api-reference/types/smaterial.md) **Target** `get` `set` *Property Description* * Lua ```lua Space.Host.ExecutingObject.AudioReactiveMaterial.Target = AMaterial ``` ##### OriginalMaterial[​](#originalmaterial "Direct link to OriginalMaterial") [SMaterial](/scripting/client-scripting-api-reference/types/smaterial.md) **OriginalMaterial** `get` `set` *Property Description* * Lua ```lua Space.Host.ExecutingObject.AudioReactiveMaterial.OriginalMaterial = AMaterial ``` ##### TargetMaterial[​](#targetmaterial "Direct link to TargetMaterial") [SMaterial](/scripting/client-scripting-api-reference/types/smaterial.md) **TargetMaterial** `get` `set` *Property Description* * Lua ```lua Space.Host.ExecutingObject.AudioReactiveMaterial.TargetMaterial = AMaterial ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Returns a reference to the GameObject of this component.* * Lua ```lua theGameObject = Space.Host.ExecutingObject.AudioReactiveMaterial.GameObject ``` --- ### SAudioReactiveParticleSystem #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | --------------------------------------------------------------------------------------------------------------------------------------- | | bool [**Enabled** ](/scripting/client-scripting-api-reference/components/saudioreactiveparticlesystem.md#enabled)`get` `set` | | SGameObject [**Target** ](/scripting/client-scripting-api-reference/components/saudioreactiveparticlesystem.md#target)`get` `set` | | bool [**Position** ](/scripting/client-scripting-api-reference/components/saudioreactiveparticlesystem.md#position)`get` `set` | | SVector [**MinPosition** ](/scripting/client-scripting-api-reference/components/saudioreactiveparticlesystem.md#minposition)`get` `set` | | SVector [**MaxPosition** ](/scripting/client-scripting-api-reference/components/saudioreactiveparticlesystem.md#maxposition)`get` `set` | | bool [**Rotation** ](/scripting/client-scripting-api-reference/components/saudioreactiveparticlesystem.md#rotation)`get` `set` | | SVector [**MinRotation** ](/scripting/client-scripting-api-reference/components/saudioreactiveparticlesystem.md#minrotation)`get` `set` | | SVector [**MaxRotation** ](/scripting/client-scripting-api-reference/components/saudioreactiveparticlesystem.md#maxrotation)`get` `set` | | bool [**Scale** ](/scripting/client-scripting-api-reference/components/saudioreactiveparticlesystem.md#scale)`get` `set` | | SVector [**MinScale** ](/scripting/client-scripting-api-reference/components/saudioreactiveparticlesystem.md#minscale)`get` `set` | | SVector [**MaxScale** ](/scripting/client-scripting-api-reference/components/saudioreactiveparticlesystem.md#maxscale)`get` `set` | #### Properties[​](#properties "Direct link to Properties") ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` *Property Description* * Lua ```lua Space.Host.ExecutingObject.AudioReactiveParticleSystem.Enabled = true ``` * Lua ```lua --clicking this object will Enable/Disable it's Audio Reactive Particle System component thisGameObject = Space.Host.ExecutingObject component = thisGameObject.AudioReactiveParticleSystem OnClick = function() component.Enabled = not component.Enabled end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### Target[​](#target "Direct link to Target") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **Target** `get` `set` *Property Description* * Lua ```lua targetGameObject = Space.Host.ExecutingObject.AudioReactiveParticleSystem.Target ``` ##### Position[​](#position "Direct link to Position") bool **Position** `get` `set` *Property Description* * Lua ```lua Space.Host.ExecutingObject.AudioReactiveParticleSystem.Position = true ``` ##### MinPosition[​](#minposition "Direct link to MinPosition") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **MinPosition** `get` `set` *Property Description* * Lua ```lua Space.Host.ExecutingObject.AudioReactiveParticleSystem.MinPosition = Vector.New(0,0,0) ``` ##### MaxPosition[​](#maxposition "Direct link to MaxPosition") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **MaxPosition** `get` `set` *Property Description* * Lua ```lua Space.Host.ExecutingObject.AudioReactiveParticleSystem.MaxPosition = Vector.New(10,10,10) ``` ##### Rotation[​](#rotation "Direct link to Rotation") bool **Rotation** `get` `set` *Property Description* * Lua ```lua Space.Host.ExecutingObject.AudioReactiveParticleSystem.Rotation = true ``` ##### MinRotation[​](#minrotation "Direct link to MinRotation") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **MinRotation** `get` `set` *Property Description* * Lua ```lua Space.Host.ExecutingObject.AudioReactiveParticleSystem.MinRotation = Vector.New(0,0,0) ``` ##### MaxRotation[​](#maxrotation "Direct link to MaxRotation") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **MaxRotation** `get` `set` *Property Description* * Lua ```lua Space.Host.ExecutingObject.AudioReactiveParticleSystem.MaxRotation = Vector.New(10,10,10) ``` ##### Scale[​](#scale "Direct link to Scale") bool **Scale** `get` `set` *Property Description* * Lua ```lua Space.Host.ExecutingObject.AudioReactiveParticleSystem.Scale = true ``` ##### MinScale[​](#minscale "Direct link to MinScale") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **MinScale** `get` `set` *Property Description* * Lua ```lua Space.Host.ExecutingObject.AudioReactiveParticleSystem.MinScale = Vector.New(1,1,1) ``` ##### MaxScale[​](#maxscale "Direct link to MaxScale") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **MaxScale** `get` `set` *Property Description* * Lua ```lua Space.Host.ExecutingObject.AudioReactiveParticleSystem.MaxScale = Vector.New(1.2,1.2,1.2) ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Returns a reference to the GameObject of this component.* * Lua ```lua theGameObject = Space.Host.ExecutingObject.AudioReactiveParticleSystem.GameObject ``` --- ### SAudioReactiveTransform #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ---------------------------------------------------------------------------------------------------------------------------------- | | bool [**Enabled** ](/scripting/client-scripting-api-reference/components/saudioreactivetransform.md#enabled)`get` `set` | | SGameObject [**Target** ](/scripting/client-scripting-api-reference/components/saudioreactivetransform.md#target)`get` `set` | | bool [**Position** ](/scripting/client-scripting-api-reference/components/saudioreactivetransform.md#position)`get` `set` | | SVector [**MinPosition** ](/scripting/client-scripting-api-reference/components/saudioreactivetransform.md#minposition)`get` `set` | | SVector [**MaxPosition** ](/scripting/client-scripting-api-reference/components/saudioreactivetransform.md#maxposition)`get` `set` | | bool [**Rotation** ](/scripting/client-scripting-api-reference/components/saudioreactivetransform.md#rotation)`get` `set` | | SVector [**MinRotation** ](/scripting/client-scripting-api-reference/components/saudioreactivetransform.md#minrotation)`get` `set` | | SVector [**MaxRotation** ](/scripting/client-scripting-api-reference/components/saudioreactivetransform.md#maxrotation)`get` `set` | | bool [**Scale** ](/scripting/client-scripting-api-reference/components/saudioreactivetransform.md#scale)`get` `set` | | SVector [**MinScale** ](/scripting/client-scripting-api-reference/components/saudioreactivetransform.md#minscale)`get` `set` | | SVector [**MaxScale** ](/scripting/client-scripting-api-reference/components/saudioreactivetransform.md#maxscale)`get` `set` | #### Properties[​](#properties "Direct link to Properties") ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` *Whether the Audio Reactive Transform component is enabled or not.* * Lua ```lua Space.Host.ExecutingObject.AudioReactiveTransform.Enabled= false ``` * Lua ```lua --clicking this object will Enable/Disable it's Audio Reactive Transform component thisGameObject = Space.Host.ExecutingObject component = thisGameObject.AudioReactiveTransform OnClick = function() component.Enabled = not component.Enabled end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### Target[​](#target "Direct link to Target") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **Target** `get` `set` *The target GameObject which will be affected by the Audio Reactive Transform.* * Lua ```lua target = Space.Host.ExecutingObject.AudioReactiveTransform.Target ``` * Lua ```lua --clicking this object will toggle between two different Audio Reactive Transform targets thisObject = Space.Host.ExecutingObject target1 = Space.Host.GetReference("theTarget1") --add this reference to Scripting Runtime component target2 = Space.Host.GetReference("theTarget2") --add this reference to Scripting Runtime component function OnClickFunction() if thisObject.AudioReactiveTransform.Target == target1 then thisObject.AudioReactiveTransform.Target = target2 else thisObject.AudioReactiveTransform.Target = target1 end end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### Position[​](#position "Direct link to Position") bool **Position** `get` `set` *Whether or not the target's position will be affected by the Audio Reactive Transform.* * Lua ```lua Space.Host.ExecutingObject.AudioReactiveTransform.Position = true ``` * Lua ```lua --clicking this object will toggle it's Audio Reactive Transform Position property thisObject = Space.Host.ExecutingObject function OnClickFunction() thisObject.AudioReactiveTransform.Position = not thisObject.AudioReactiveTransform.Position end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### MinPosition[​](#minposition "Direct link to MinPosition") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **MinPosition** `get` `set` *Returns MinPosition value of the Audio Reactive Transform.* * Lua ```lua Space.Host.ExecutingObject.AudioReactiveTransform.MinPosition = Vector.New(0,1,0) ``` ##### MaxPosition[​](#maxposition "Direct link to MaxPosition") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **MaxPosition** `get` `set` *Returns MaxPosition value of the Audio Reactive Transform.* * Lua ```lua Space.Host.ExecutingObject.AudioReactiveTransform.MaxPosition = Vector.New(1,2,1) ``` ##### Rotation[​](#rotation "Direct link to Rotation") bool **Rotation** `get` `set` *Whether or not the target's rotation will be affected by the Audio Reactive Transform.* * Lua ```lua Space.Host.ExecutingObject.AudioReactiveTransform.Rotation= true ``` * Lua ```lua --clicking this object will toggle it's Audio Reactive Transform Rotation property thisObject = Space.Host.ExecutingObject function OnClickFunction() thisObject.AudioReactiveTransform.Rotation= not thisObject.AudioReactiveTransform.Rotation end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### MinRotation[​](#minrotation "Direct link to MinRotation") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **MinRotation** `get` `set` *Returns MinRotation value of the Audio Reactive Transform.* * Lua ```lua Space.Host.ExecutingObject.AudioReactiveTransform.MinRotation = Vector.New(0,30,0) ``` ##### MaxRotation[​](#maxrotation "Direct link to MaxRotation") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **MaxRotation** `get` `set` *Returns MaxRotation value of the Audio Reactive Transform.* * Lua ```lua Space.Host.ExecutingObject.AudioReactiveTransform.MinRotation = Vector.New(0,60,0) ``` ##### Scale[​](#scale "Direct link to Scale") bool **Scale** `get` `set` *Whether or not the target's scale will be affected by the Audio Reactive Transform.* * Lua ```lua Space.Host.ExecutingObject.AudioReactiveTransform.Scale= true ``` * Lua ```lua --clicking this object will toggle it's Audio Reactive Transform Scale property thisObject = Space.Host.ExecutingObject function OnClickFunction() thisObject.AudioReactiveTransform.Scale= not thisObject.AudioReactiveTransform.Scale end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### MinScale[​](#minscale "Direct link to MinScale") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **MinScale** `get` `set` *Returns MinScale value of the Audio Reactive Transform.* * Lua ```lua Space.Host.ExecutingObject.AudioReactiveTransform.MinScale = Vector.New(1,1,1) ``` ##### MaxScale[​](#maxscale "Direct link to MaxScale") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **MaxScale** `get` `set` *Returns MaxScale value of the Audio Reactive Transform.* * Lua ```lua Space.Host.ExecutingObject.AudioReactiveTransform.MaxScale = Vector.New(2,2,2) ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Returns a reference to the GameObject of this component.* * Lua ```lua theGameObject = Space.Host.ExecutingObject.AudioReactiveTransform.GameObject ``` --- ### SAudioSource #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | void [**Play** ](/scripting/client-scripting-api-reference/components/saudiosource.md#play)() | | void [**Stop** ](/scripting/client-scripting-api-reference/components/saudiosource.md#stop)() | | void [**Pause** ](/scripting/client-scripting-api-reference/components/saudiosource.md#pause)() | | void [**UnPause** ](/scripting/client-scripting-api-reference/components/saudiosource.md#unpause)() | | void [**PlayOneShot** ](/scripting/client-scripting-api-reference/components/saudiosource.md#playoneshot)(SResource clip, float volume) | | void [**PlayClipAtPoint** ](/scripting/client-scripting-api-reference/components/saudiosource.md#playclipatpoint)(SResource clip, SVector position, float volume=1f) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ---------------------------------------------------------------------------------------------------------------------------------------- | | bool [**Enabled** ](/scripting/client-scripting-api-reference/components/saudiosource.md#enabled)`get` `set` | | bool [**Loop** ](/scripting/client-scripting-api-reference/components/saudiosource.md#loop)`get` `set` | | float [**DopplerLevel** ](/scripting/client-scripting-api-reference/components/saudiosource.md#dopplerlevel)`get` `set` | | float [**Volume** ](/scripting/client-scripting-api-reference/components/saudiosource.md#volume)`get` `set` | | float [**Pitch** ](/scripting/client-scripting-api-reference/components/saudiosource.md#pitch)`get` `set` | | float [**Time** ](/scripting/client-scripting-api-reference/components/saudiosource.md#time)`get` `set` | | int [**TimeSamples** ](/scripting/client-scripting-api-reference/components/saudiosource.md#timesamples)`get` `set` | | float [**Length** ](/scripting/client-scripting-api-reference/components/saudiosource.md#length)`get` | | int [**Samples** ](/scripting/client-scripting-api-reference/components/saudiosource.md#samples)`get` | | bool [**IsPlaying** ](/scripting/client-scripting-api-reference/components/saudiosource.md#isplaying)`get` | | float [**PanStereo** ](/scripting/client-scripting-api-reference/components/saudiosource.md#panstereo)`get` `set` | | float [**SpatialBlend** ](/scripting/client-scripting-api-reference/components/saudiosource.md#spatialblend)`get` `set` | | bool [**Spatialize** ](/scripting/client-scripting-api-reference/components/saudiosource.md#spatialize)`get` `set` | | bool [**SpatializePostEffects** ](/scripting/client-scripting-api-reference/components/saudiosource.md#spatializeposteffects)`get` `set` | | float [**ReverbZoneMix** ](/scripting/client-scripting-api-reference/components/saudiosource.md#reverbzonemix)`get` `set` | | bool [**BypassEffects** ](/scripting/client-scripting-api-reference/components/saudiosource.md#bypasseffects)`get` `set` | | bool [**BypassListenerEffects** ](/scripting/client-scripting-api-reference/components/saudiosource.md#bypasslistenereffects)`get` `set` | | bool [**BypassReverbZones** ](/scripting/client-scripting-api-reference/components/saudiosource.md#bypassreverbzones)`get` `set` | | float [**Spread** ](/scripting/client-scripting-api-reference/components/saudiosource.md#spread)`get` `set` | | int [**Priority** ](/scripting/client-scripting-api-reference/components/saudiosource.md#priority)`get` `set` | | bool [**Mute** ](/scripting/client-scripting-api-reference/components/saudiosource.md#mute)`get` `set` | | float [**MinDistance** ](/scripting/client-scripting-api-reference/components/saudiosource.md#mindistance)`get` `set` | | float [**MaxDistance** ](/scripting/client-scripting-api-reference/components/saudiosource.md#maxdistance)`get` `set` | | SResource [**AudioClip** ](/scripting/client-scripting-api-reference/components/saudiosource.md#audioclip)`get` `set` | #### Functions[​](#functions "Direct link to Functions") ##### Play[​](#play "Direct link to Play") void **Play** () *Starts playing the audio clip.* * Lua ```lua Space.Host.ExecutingObject.Audio.Play() ``` * Lua ```lua -- For example, we have a short chime that we want to play every time a new avatar joins the scene. hostObject = Space.Host.ExecutingObject function welcomeSound () hostObject.Audio.Play() end Space.Scene.OnPlayerJoin(welcomeSound) ``` ##### Stop[​](#stop "Direct link to Stop") void **Stop** () *Stops playing the audio clip.* * Lua ```lua Space.Host.ExecutingObject.Audio.Stop() ``` * Lua ```lua hostObject = Space.Host.ExecutingObject; function audioOnOff () if hostObject.Audio.IsPlaying then hostObject.Audio.Stop(); else hostObject.Audio.Play(); end Space.Log(hostObject.Audio.IsPlaying); end hostObject.SubscribeToEvents(); hostObject.OnMouseDown(audioOnOff); -- Now, we can make the sound play or stop playing just by clicking the object. ``` ##### Pause[​](#pause "Direct link to Pause") void **Pause** () *Pauses the audio clip.* * Lua ```lua Space.Host.ExecutingObject.Audio.Pause() ``` * Lua ```lua hostObject = Space.Host.ExecutingObject; function pauseOnOff () if hostObject.Audio.IsPlaying then hostObject.Audio.Pause(); else hostObject.Audio.UnPause(); end Space.Log(hostObject.Audio.IsPlaying); end hostObject.SubscribeToEvents(); hostObject.OnMouseDown(pauseOnOff); -- Now, every time an object is clicked, the sound clip is paused/unpaused ``` ##### UnPause[​](#unpause "Direct link to UnPause") void **UnPause** () *Pauses the audio clip.* * Lua ```lua Space.Host.ExecutingObject.Audio.UnPause() ``` * Lua ```lua hostObject = Space.Host.ExecutingObject; function pauseOnOff () if hostObject.Audio.IsPlaying then hostObject.Audio.Pause(); else hostObject.Audio.UnPause(); end Space.Log(hostObject.Audio.IsPlaying); end hostObject.SubscribeToEvents(); hostObject.OnMouseDown(pauseOnOff); -- Now, every time an object is clicked, the sound clip is paused/unpaused ``` ##### PlayOneShot[​](#playoneshot "Direct link to PlayOneShot") void **PlayOneShot** ([SResource](/scripting/client-scripting-api-reference/types/sresource.md) clip, float volume) *Plays the audio clip just ones at a desired volume.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Audio.PlayOneShot(AResource, 1.0) ``` * Lua ```lua hostObject = Space.Host.ExecutingObject; function playOnce () hostObject.Audio.PlayOneShot(Space.Resources[0],0.5); end hostObject.SubscribeToEvents(); hostObject.OnMouseDown(playOnce); -- Now, every time the object is clicked, a sound clip we have in Scripting Runtime Resources is played at half the volume. -- This happens regardless if the audio clip in the AudioClip property is playing or not. ``` ##### PlayClipAtPoint[​](#playclipatpoint "Direct link to PlayClipAtPoint") void **PlayClipAtPoint** ([SResource](/scripting/client-scripting-api-reference/types/sresource.md) clip,[ SVector](/scripting/client-scripting-api-reference/types/svector.md) position, float volume=1f) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Audio.PlayClipAtPoint(AResource, AVector) --or Space.Host.ExecutingObject.Audio.PlayClipAtPoint(AResource, AVector, 0.5) ``` #### Properties[​](#properties "Direct link to Properties") ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` *Is the Audio Source component enabled?* * Lua ```lua Space.Host.ExecutingObject.Audio.Enabled = false ``` * Lua ```lua hostObject = Space.Host.ExecutingObject; function audioOnOff () hostObject.Audio.Enabled = not hostObject.Audio.Enabled; Space.Log(hostObject.Audio.Enabled); end hostObject.SubscribeToEvents(); hostObject.OnMouseDown(audioOnOff); -- When the host object is clicked, the Audio Source component gets enabled, if it was disabled, -- or disabled, if it was enabled, and its new state is printed to the console. ``` ##### Loop[​](#loop "Direct link to Loop") bool **Loop** `get` `set` *Is looping of the sound clip enabled?* * Lua ```lua Space.Host.ExecutingObject.Audio.Loop = true ``` * Lua ```lua --the below script will make the object toggle it's Loop option OnClick --[Add "audio" reference to the Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject audio = Space.Host.GetReference("audio").Audio OnClick = function() audio.Loop = not audio.Loop end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### DopplerLevel[​](#dopplerlevel "Direct link to DopplerLevel") float **DopplerLevel** `get` `set` *The Doppler level of the Audio Source. (See: Doppler Effect)* * Lua ```lua Space.Host.ExecutingObject.Audio.DopplerLevel = 0.5 ``` * Lua ```lua --the below script will make a slider change the Audio Source's Doppler Level --[Add "slider" and "audio" references to the Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject slider = Space.Host.GetReference("slider").UISlider audio = Space.Host.GetReference("audio").Audio OVC = function() audio.DopplerLevel = slider.Value * 5 --0 to 5 end slider.OnValueChanged(OVC) ``` ##### Volume[​](#volume "Direct link to Volume") float **Volume** `get` `set` *The Volume level of the Audio Source.* * Lua ```lua Space.Host.ExecutingObject.Audio.Volume = 0.5 ``` * Lua ```lua hostObject = Space.Host.ExecutingObject; Space.Log(hostObject.Audio.Volume); -- 1 by default function audioVolumeDecr () if hostObject.Audio.Volume > 0 then hostObject.Audio.Volume = hostObject.Audio.Volume - 0.2; end Space.Log(hostObject.Audio.Volume); end hostObject.SubscribeToEvents(); hostObject.OnMouseDown(audioVolumeDecr); -- Now, every time we click this object, the Volume level is decreased by 0.2, until it reaches 0. ``` ##### Pitch[​](#pitch "Direct link to Pitch") float **Pitch** `get` `set` *The Pitch level for the Audio Source.* * Lua ```lua Space.Host.ExecutingObject.Audio.Pitch = 0.5 ``` * Lua ```lua hostObject = Space.Host.ExecutingObject; Space.Log(hostObject.Audio.Pitch); -- 1 by default function audioPitchChange () if hostObject.Audio.Pitch < 3 then hostObject.Audio.Pitch = hostObject.Audio.Pitch + 0.5; end Space.Log(hostObject.Audio.Pitch); end hostObject.SubscribeToEvents(); hostObject.OnMouseDown(audioPitchChange); -- Now, every time we click this object, the Pitch level is increased by 0.5, until it reaches 3. ``` ##### Time[​](#time "Direct link to Time") float **Time** `get` `set` *Playback position in seconds.* * Lua ```lua Space.Host.ExecutingObject.Audio.Time = 10 ``` * Lua ```lua --the below script will make a slider set Audio Source's playback position (using seconds) --[Add "slider" and "audio" references to the Scripting Runtime component] slider = Space.Host.GetReference("slider").UISlider audio = Space.Host.GetReference("audio").Audio OVC = function() audio.Time = slider.Value * audio.Length -- from 0 to Length of clip end slider.OnValueChanged(OVC) ``` ##### TimeSamples[​](#timesamples "Direct link to TimeSamples") int **TimeSamples** `get` `set` *Playback position in PCM samples.* * Lua ```lua Space.Host.ExecutingObject.Audio.TimeSamples = 5 ``` * Lua ```lua --the below script will make a slider set Audio Source's playback position (using PCM Samples) --[Add "slider" and "audio" references to the Scripting Runtime component] slider = Space.Host.GetReference("slider").UISlider audio = Space.Host.GetReference("audio").Audio OVC = function() audio.TimeSamples = slider.Value * audio.Samples -- from 0 to number of samples end slider.OnValueChanged(OVC) ``` ##### Length[​](#length "Direct link to Length") float **Length** `get` *Return Audio Length.* * Lua ```lua AudioLength = Space.Host.ExecutingObject.Audio.Length ``` * Lua ```lua --the below script will make a slider set Audio Source's playback position (using seconds) --[Add "slider" and "audio" references to the Scripting Runtime component] slider = Space.Host.GetReference("slider").UISlider audio = Space.Host.GetReference("audio").Audio OVC = function() audio.Time = slider.Value * audio.Length -- from 0 to Length of clip end slider.OnValueChanged(OVC) ``` ##### Samples[​](#samples "Direct link to Samples") int **Samples** `get` *Return Audio Samples.* * Lua ```lua numSamples = Space.Host.ExecutingObject.Audio.Samples ``` * Lua ```lua --the below script will make a slider set Audio Source's playback position (using PCM Samples) --[Add "slider" and "audio" references to the Scripting Runtime component] slider = Space.Host.GetReference("slider").UISlider audio = Space.Host.GetReference("audio").Audio OVC = function() audio.TimeSamples = slider.Value * audio.Samples -- from 0 to number of samples end slider.OnValueChanged(OVC) ``` ##### IsPlaying[​](#isplaying "Direct link to IsPlaying") bool **IsPlaying** `get` *Is the sound clip playing right now?* * Lua ```lua numSamples = Space.Host.ExecutingObject.Audio.IsPlaying ``` * Lua ```lua --this script will play a looping sound only if someone is using the seat --and will stop the sound if someone is not --(Example: carnival game ) --[Object must contain a Seat component and AudioSource component] thisGameObject = Space.Host.ExecutingObject OnUpdate = function() if thisGameObject.Seat.InUse then if not thisGameObject.Audio.IsPlaying then thisGameObject.Audio.Play() end else if thisGameObject.Audio.IsPlaying then thisGameObject.Audio.Stop() end end end thisGameObject.Audio.Loop = true thisGameObject.SubscribeToEvents() thisGameObject.OnUpdate(OnUpdate) ``` ##### PanStereo[​](#panstereo "Direct link to PanStereo") float **PanStereo** `get` `set` *Pans the sound to the left or right. Values range from -1 to 1: 0 is the middle, -1 is full left, 1 is full right.* * Lua ```lua Space.Host.ExecutingObject.Audio.PanStereo = -1 ``` * Lua ```lua --the below script will make a slider set the Stereo Pan --[Add "slider" and "audio" references to the Scripting Runtime component] slider = Space.Host.GetReference("slider").UISlider audio = Space.Host.GetReference("audio").Audio OVC = function() audio.PanStereo = (slider.Value * 2) - 1 --(from -1 left to +1 right) end slider.OnValueChanged(OVC) ``` ##### SpatialBlend[​](#spatialblend "Direct link to SpatialBlend") float **SpatialBlend** `get` `set` *The level of impact 3D effects make on the AudioSource. 0 - no impact (full 2D sound), 1 - maximum impact (full 3D sound).* * Lua ```lua Space.Host.ExecutingObject.Audio.SpatialBlend = 1 ``` * Lua ```lua hostObject = Space.Host.ExecutingObject; function spBlendChange () if hostObject.Audio.SpatialBlend < 1 then hostObject.Audio.SpatialBlend = hostObject.Audio.SpatialBlend + 0.2; else hostObject.Audio.SpatialBlend = 0; end Space.Log(hostObject.Audio.SpatialBlend); end hostObject.SubscribeToEvents(); hostObject.OnMouseDown(spBlendChange); -- Spatial Blend is increased by 0.2 every time the object is clicked, until it reaches 1. -- Then with the next click, it resets back to 0. ``` ##### Spatialize[​](#spatialize "Direct link to Spatialize") bool **Spatialize** `get` `set` *Is spatialization enabled?* * Lua ```lua Space.Host.ExecutingObject.Audio.Spatialize = true ``` * Lua ```lua --the below script will make the object toggle it's Spatialize feature OnClick --[Add "audio" reference to the Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject audio = Space.Host.GetReference("audio").Audio OnClick = function() audio.Spatialize = not audio.Spatialize end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### SpatializePostEffects[​](#spatializeposteffects "Direct link to SpatializePostEffects") bool **SpatializePostEffects** `get` `set` *Is spatialization enabled before or after other filters are in action?* * Lua ```lua Space.Host.ExecutingObject.Audio.SpatializePostEffects = true ``` * Lua ```lua --the below script will make the object toggle it's Spatialize Post Effects feature OnClick --[Add "audio" reference to the Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject audio = Space.Host.GetReference("audio").Audio OnClick = function() audio.SpatializePostEffects = not audio.SpatializePostEffects end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### ReverbZoneMix[​](#reverbzonemix "Direct link to ReverbZoneMix") float **ReverbZoneMix** `get` `set` *The level at which the audio coming from this Audio Source will be mixed into the global reverb of the scene (accomplished with Reverb Zones).* * Lua ```lua Space.Host.ExecutingObject.Audio.ReverbZoneMix = true ``` * Lua ```lua exa--the below script will make a slider set the Reverb Zone Mix value --[Add "slider" and "audio" references to the Scripting Runtime component] slider = Space.Host.GetReference("slider").UISlider audio = Space.Host.GetReference("audio").Audio OVC = function() audio.ReverbZoneMix = (slider.Value * 1.1) --(from 0.0 to 1.1) end slider.OnValueChanged(OVC) ``` ##### BypassEffects[​](#bypasseffects "Direct link to BypassEffects") bool **BypassEffects** `get` `set` *When true, none of global sound effects (reverbs, filters, etc.) are applied to the audio from this Audio Source.* * Lua ```lua Space.Host.ExecutingObject.Audio.BypassEffects = true ``` * Lua ```lua --the below script will make the object toggle it's Bypass Effects feature OnClick --[Add "audio" reference to the Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject audio = Space.Host.GetReference("audio").Audio OnClick = function() audio.BypassEffects = not audio.BypassEffects end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### BypassListenerEffects[​](#bypasslistenereffects "Direct link to BypassListenerEffects") bool **BypassListenerEffects** `get` `set` *When true, whichever global effects are set on the Audio Listener will not be applied to the audio from this Audio Source.* * Lua ```lua Space.Host.ExecutingObject.Audio.BypassListenerEffects = true ``` * Lua ```lua --the below script will make the object toggle it's Bypass Listener Effects feature OnClick --[Add "audio" reference to the Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject audio = Space.Host.GetReference("audio").Audio OnClick = function() audio.BypassListenerEffects = not audio.BypassListenerEffects end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### BypassReverbZones[​](#bypassreverbzones "Direct link to BypassReverbZones") bool **BypassReverbZones** `get` `set` *When true, the audio from this Audio Source is not mixed into the global reverb generated through Reverb Zones.* * Lua ```lua Space.Host.ExecutingObject.Audio.BypassReverbZones = true ``` * Lua ```lua --the below script will make the object toggle it's Bypass Reverb Zones feature OnClick --[Add "audio" reference to the Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject audio = Space.Host.GetReference("audio").Audio OnClick = function() audio.BypassReverbZones = not audio.BypassReverbZones end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### Spread[​](#spread "Direct link to Spread") float **Spread** `get` `set` *The angle of spread of the audio channels in the 3D space (only works for stereo and multichannel audio). 0 by default - all channels are concentrated at the same speaker location, making it "mono".* * Lua ```lua Space.Host.ExecutingObject.Audio.Spread = 10.0 ``` * Lua ```lua hostObject = Space.Host.ExecutingObject; function increaseSpread () if hostObject.Audio.Spread < 360 then hostObject.Audio.Spread = hostObject.Audio.Spread + 90; end Space.Log(hostObject.Audio.Spread); end hostObject.SubscribeToEvents(); hostObject.OnMouseDown(increaseSpread); -- Every time an object is clicked, the spread increases by 90 degrees - compare the sound at different angles of spread! ``` ##### Priority[​](#priority "Direct link to Priority") int **Priority** `get` `set` *The priority of this Audio Source: when there are more Audio Sources playing than channels available, Priority defines which channels will be discarded in favour of those with a higher priority. 0 is the highest priority, 255 - the lowest.* * Lua ```lua Space.Host.ExecutingObject.Audio.Priority = 50 ``` * Lua ```lua hostObject = Space.Host.ExecutingObject; function changePriority () if hostObject.Audio.Priority == 0 then hostObject.Audio.Priority = 255; else hostObject.Audio.Priority = 0; end Space.Log(hostObject.Audio.Priority); end hostObject.SubscribeToEvents(); hostObject.OnMouseDown(changePriority); -- Now the Audio Source alternates between the highest and the lowest priorities. -- This can be useful, for example, in a scene with an ambient sound set at Priority 128, where we have a speaker, which plays a certain looped audio nonstop. -- When we want to hear the audio, we change it to the highest priority, so it blocks the ambient sound. -- When we don't, we change it to the lowest, and the ambient sound dominates the scene again. ``` ##### Mute[​](#mute "Direct link to Mute") bool **Mute** `get` `set` *Is the audio muted? If True, the Volume is set to 0. If False, the Volume is restored to the original level.* * Lua ```lua Space.Host.ExecutingObject.Audio.Mute = true ``` * Lua ```lua hostObject = Space.Host.ExecutingObject; function muteOnOff () hostObject.Audio.Mute = not hostObject.Audio.Mute; Space.Log(hostObject.Audio.Mute); end hostObject.SubscribeToEvents(); hostObject.OnMouseDown(muteOnOff); -- Now clicking the object works like the Mute button. ``` ##### MinDistance[​](#mindistance "Direct link to MinDistance") float **MinDistance** `get` `set` *At which distance from the Audio Source the sound will begin ceasing? The sound will be heard at its maximum volume within this distance. (Spatial Blend should not be equal to 0 for this property to take effect.)* * Lua ```lua Space.Host.ExecutingObject.Audio.MinDistance = 2.0 ``` * Lua ```lua --the below script will make a slider set the Minimum Distance --[Add "slider" and "audio" references to the Scripting Runtime component] slider = Space.Host.GetReference("slider").UISlider audio = Space.Host.GetReference("audio").Audio OVC = function() audio.MinDistance = (slider.Value * 20) + 10 --(from 10 to 30) end slider.OnValueChanged(OVC) ``` ##### MaxDistance[​](#maxdistance "Direct link to MaxDistance") float **MaxDistance** `get` `set` *At which distance from the Audio Source the sound will no longer be heard? (Spatial Blend should not be equal to 0 for this property to take effect.)* * Lua ```lua Space.Host.ExecutingObject.Audio.MaxDistance = 10.0 ``` * Lua ```lua --the below script will make a slider set the Maximum Distance --[Add "slider" and "audio" references to the Scripting Runtime component] slider = Space.Host.GetReference("slider").UISlider audio = Space.Host.GetReference("audio").Audio OVC = function() audio.MaxDistance = (slider.Value * 40) + 60 --(from 60 to 100) end slider.OnValueChanged(OVC) ``` ##### AudioClip[​](#audioclip "Direct link to AudioClip") [SResource](/scripting/client-scripting-api-reference/types/sresource.md) **AudioClip** `get` `set` *The audio clip that is or will be played by this Audio Source.* * Lua ```lua Space.Host.ExecutingObject.Audio.AudioClip = AResource ``` * Lua ```lua -- In this example, there are 3 audio clips in Scripting Runtime Resources hostObject = Space.Host.ExecutingObject; local nextTrack = 0; function changeTrack () hostObject.Audio.AudioClip = Space.Resources[nextTrack]; hostObject.Audio.Play(); Space.Log(Space.Resources[nextTrack].Name); if nextTrack == 2 then -- replace 2 with n-1, where n is the amount of audio clips you have added to Resources nextTrack = 0; else nextTrack = nextTrack + 1; end end hostObject.SubscribeToEvents(); hostObject.OnMouseDown(changeTrack); -- Now, every time the object is clicked, the next audio clip is played. -- What's more, the list is looped (the index resets back to 0 when it gets to the end of the list)! ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Returns a reference to the GameObject of this component.* * Lua ```lua theGameObject = Space.Host.ExecutingObject.Audio.GameObject ``` --- ### SBoxCollider #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ---------------------------------------------------------------------------------------------------------------- | | SVector [**Center** ](/scripting/client-scripting-api-reference/components/sboxcollider.md#center)`get` `set` | | SVector [**Size** ](/scripting/client-scripting-api-reference/components/sboxcollider.md#size)`get` `set` | | bool [**Enabled** ](/scripting/client-scripting-api-reference/components/sboxcollider.md#enabled)`get` `set` | | bool [**IsTrigger** ](/scripting/client-scripting-api-reference/components/sboxcollider.md#istrigger)`get` `set` | #### Properties[​](#properties "Direct link to Properties") ##### Center[​](#center "Direct link to Center") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **Center** `get` `set` *The position of the center of the Box Collider.* * Lua ```lua Center = Space.Host.ExecutingObject.BoxCollider.Center ``` * Lua ```lua --clicking this object moves it's Box Collider's center one unit upwards thisObject = Space.Host.ExecutingObject OnClick = function() center = thisObject.BoxCollider.Center thisObject.BoxCollider.Center = Vector.New(center.X,center.Y + 1, center.Z) end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### Size[​](#size "Direct link to Size") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **Size** `get` `set` *The size of the box.* * Lua ```lua Size= Space.Host.ExecutingObject.BoxCollider.Size ``` * Lua ```lua --clicking this object increases it's Box Collider's size by one unit thisObject = Space.Host.ExecutingObject OnClick = function() size = thisObject.BoxCollider.Size thisObject.BoxCollider.Size = Vector.New(size.X + 1,size.Y + 1, size.Z + 1) end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` *Enabled Colliders will collide with other Colliders, disabled Colliders won't.* * Lua ```lua Space.Host.ExecutingObject.BoxCollider.Enabled = false ``` * Lua ```lua --clicking this object toggles it's Box Collider On/Off thisObject = Space.Host.ExecutingObject OnClick = function() thisObject.BoxCollider.Enabled = not thisObject.BoxCollider.Enabled end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### IsTrigger[​](#istrigger "Direct link to IsTrigger") bool **IsTrigger** `get` `set` *Is the collider a trigger?* * Lua ```lua Space.Host.ExecutingObject.BoxCollider.Enabled = true ``` * Lua ```lua --clicking this object toggles it's Box Collider between being a Collider and Trigger Collider thisObject = Space.Host.ExecutingObject OnClick = function() thisObject.BoxCollider.IsTrigger = not thisObject.BoxCollider.IsTrigger end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Returns a reference to the GameObject of this component.* * Lua ```lua theGameObject = Space.Host.ExecutingObject.BoxCollider.GameObject ``` --- ### SBrowserSurface #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | ----------------------------------------------------------------------------------------------------------------------------------------------------- | | void [**SetURL** ](/scripting/client-scripting-api-reference/components/sbrowsersurface.md#seturl)(string url) | | void [**Back** ](/scripting/client-scripting-api-reference/components/sbrowsersurface.md#back)() | | void [**Forward** ](/scripting/client-scripting-api-reference/components/sbrowsersurface.md#forward)() | | void [**Reload** ](/scripting/client-scripting-api-reference/components/sbrowsersurface.md#reload)() | | void [**RegisterFunction** ](/scripting/client-scripting-api-reference/components/sbrowsersurface.md#registerfunction)(string name, Closure function) | | void [**CallFunction** ](/scripting/client-scripting-api-reference/components/sbrowsersurface.md#callfunction)(string name, string argument) | | void [**OnURLChanged** ](/scripting/client-scripting-api-reference/components/sbrowsersurface.md#onurlchanged)(Closure e) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ----------------------------------------------------------------------------------------------------------------------- | | bool [**Networked** ](/scripting/client-scripting-api-reference/components/sbrowsersurface.md#networked)`get` `set` | | bool [**Muted** ](/scripting/client-scripting-api-reference/components/sbrowsersurface.md#muted)`get` `set` | | bool [**CanGoBack** ](/scripting/client-scripting-api-reference/components/sbrowsersurface.md#cangoback)`get` | | bool [**CanGoForward** ](/scripting/client-scripting-api-reference/components/sbrowsersurface.md#cangoforward)`get` | | bool [**EnableInput** ](/scripting/client-scripting-api-reference/components/sbrowsersurface.md#enableinput)`get` `set` | | float [**Zoom** ](/scripting/client-scripting-api-reference/components/sbrowsersurface.md#zoom)`get` `set` | #### Functions[​](#functions "Direct link to Functions") ##### SetURL[​](#seturl "Direct link to SetURL") void **SetURL** (string url) *Sets the URL for the browser frame, and navigates to it.* | Parameter | Type | Description | | --------- | ------ | ------------------------------------------------------------------------- | | url | string | A standard URL recognized by Chromium, such as . | * Lua ```lua Space.Host.ExecutingObject.Browser.SetURL('https://www.youtube.com') ``` * Lua ```lua --the below scipt makes this object set Browser URL according to what's written in text field --(Example: Set URL button) --[Required: This object needs a Browser and InputField objects to be added as reference to references section in Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject webBrowser = Space.Host.GetReference("Browser") urlField = Space.Host.GetReference("URL Field") OnClick = function() webBrowser.Browser.SetURL(urlField.UIInputField.Text) end urlField.UIInputField.Text = "https://www.youtube.com" thisGameObject.AddClickable() thisGameObject.Clickable.Tooltip = "Click to set URL" thisGameObject.Clickable.OnClick(OnClick) ``` ##### Back[​](#back "Direct link to Back") void **Back** () *Equivalent to hitting the 'back' button within the browser.* * Lua ```lua Space.Host.ExecutingObject.Browser.Back() ``` * Lua ```lua --the below scipt makes this object a clickable that navigates Back --(Example: Browser navigation ) --[Required: Browser surface object needs to be added as a reference to the Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject browser = Space.Host.GetReference("Browser Surface Object").Browser OnClick = function() browser.Back() end thisGameObject.AddClickable() thisGameObject.Clickable.Tooltip = "Click to Enable/Disable browser Input" thisGameObject.Clickable.OnClick(OnClick) ``` ##### Forward[​](#forward "Direct link to Forward") void **Forward** () *Equivalent to hitting the 'forward' button within the browser.* * Lua ```lua Space.Host.ExecutingObject.Browser.Forward() ``` * Lua ```lua --the below scipt makes this object a clickable that navigates Forward --(Example: Browser navigation ) --[Required: Browser surface object needs to be added as a reference to the Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject browser = Space.Host.GetReference("Browser Surface Object").Browser OnClick = function() browser.Forward() end thisGameObject.AddClickable() thisGameObject.Clickable.Tooltip = "Click to Enable/Disable browser Input" thisGameObject.Clickable.OnClick(OnClick) ``` ##### Reload[​](#reload "Direct link to Reload") void **Reload** () *Refreshes and reloads the current webpage.* * Lua ```lua Space.Host.ExecutingObject.Browser.Reload() ``` * Lua ```lua --the below scipt makes this object a clickable that reloads the page --(Example: Browser navigation ) --[Required: Browser surface object needs to be added as a reference to the Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject browser = Space.Host.GetReference("Browser Surface Object").Browser OnClick = function() browser.Reload() end thisGameObject.AddClickable() thisGameObject.Clickable.Tooltip = "Click to Enable/Disable browser Input" thisGameObject.Clickable.OnClick(OnClick) ``` ##### RegisterFunction[​](#registerfunction "Direct link to RegisterFunction") void **RegisterFunction** (string name, Closure function) *Allows a JavaScript function that exists in the browser to be called by our code.* | Parameter | Type | Description | | --------- | ------ | ----------------------------------------------------------------------------------------------------------------- | | name | string | The name of the JavaScript function we want to register. The function name should start with "**sinespace\_\_".** | * Lua ```lua Space.Host.ExecutingObject.Browser.RegisterFunction("sinespace__TestFunction", ) ``` ##### CallFunction[​](#callfunction "Direct link to CallFunction") void **CallFunction** (string name, string argument) *Calls a JS function in the browser with a single argument. The function name must begin with the characters "sinespace\_".* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Browser.CallFunction() ``` ##### OnURLChanged[​](#onurlchanged "Direct link to OnURLChanged") void **OnURLChanged** (Closure e) *Binds a function to be called whenever the URL of the Browser Surface changes* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Browser.OnURLChanged(aFunction) ``` * Lua ```lua --the below scipt makes this object clear the an InputField whenever URL changes --(Example: URL Bar) --[Required: This object needs a Browser and InputField objects to be added as reference to references section in Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject webBrowser = Space.Host.GetReference("Browser") urlField = Space.Host.GetReference("URL Field") OnURLChanged () urlField.UIInputField.Text = " " end webBrowser.Browser.OnURLChanged(OnURLChanged) ``` #### Properties[​](#properties "Direct link to Properties") ##### Networked[​](#networked "Direct link to Networked") bool **Networked** `get` `set` *Should changes to this browser be streamed to other clients within the area?.* * Lua ```lua Space.Host.ExecutingObject.Browser.Networked = true ``` * Lua ```lua --the below scipt makes this object toggle Networking on it's parent browser --(Example: browser controls) --[Required: This object needs its parent to have the browser component] thisGameObject = Space.Host.ExecutingObject OnClick = function() if thisGameObject.Parent.Browser.Networked then thisGameObject.Parent.Browser.Networked = false Space.Log("Browser will not be networked") else thisGameObject.Parent.Browser.Networked = true Space.Log("Browser will be networked") end end thisGameObject.AddClickable() thisGameObject.Clickable.Tooltip = "Click to toggle Networking on Browser" thisGameObject.Clickable.OnClick(OnClick) ``` ##### Muted[​](#muted "Direct link to Muted") bool **Muted** `get` `set` *Whether this Browser Surface is muted or not.* * Lua ```lua Space.Host.ExecutingObject.Browser.Muted=true ``` * Lua ```lua --the below scipt makes this object a clickable that mutes/unmutes a browser surface --(Example: Browser Mute button ) --[Required: This object's parent needs to be an object with BrowserSurface component in it] thisGameObject = Space.Host.ExecutingObject OnClick = function() if thisGameObject.Parent.Browser.Muted then thisGameObject.Parent.Browser.Muted = false Space.Log("Browser unmuted") else thisGameObject.Parent.Browser.Muted = true Space.Log("Browser muted") end end thisGameObject.AddClickable() thisGameObject.Clickable.Tooltip = "Click to Mute/Unmute Browser" thisGameObject.Clickable.OnClick(OnClick) ``` ##### CanGoBack[​](#cangoback "Direct link to CanGoBack") bool **CanGoBack** `get` *Returns whether this Browser Surface can navigate back* * Lua ```lua CanGoBack = Space.Host.ExecutingObject.Browser.CanGoBack ``` * Lua ```lua --the below scipt makes this Browser object show/hide it's Forward and Back --buttons according to wether the actions are possible or not --(Example: browser navigation ) --[Required: This object needs the forward and back objects added to the references section in scripting runtime] thisGameObject = Space.Host.ExecutingObject forwardButton = Space.Host.GetReference("Forward Button") backButton = Space.Host.GetReference("Back Button") OnUpdate = function() if thisGameObject.Browser.CanGoBack then backButton.Active = true else backButton.Active = false end if thisGameObject.Browser.CanGoForward then forwardButton.Active = true else forwardButton.Active = false end end thisGameObject.OnUpdate(OnUpdate) ``` ##### CanGoForward[​](#cangoforward "Direct link to CanGoForward") bool **CanGoForward** `get` *Returns whether this Browser Surface can navigate forward* * Lua ```lua CanGoForward = Space.Host.ExecutingObject.Browser.CanGoForward ``` * Lua ```lua --the below scipt makes this Browser object show/hide it's Forward and Back --buttons according to wether the actions are possible or not --(Example: browser navigation ) --[Required: This object needs the forward and back objects added to the references section in scripting runtime] thisGameObject = Space.Host.ExecutingObject forwardButton = Space.Host.GetReference("Forward Button") backButton = Space.Host.GetReference("Back Button") OnUpdate = function() if thisGameObject.Browser.CanGoBack then backButton.Active = true else backButton.Active = false end if thisGameObject.Browser.CanGoForward then forwardButton.Active = true else forwardButton.Active = false end end thisGameObject.OnUpdate(OnUpdate) ``` ##### EnableInput[​](#enableinput "Direct link to EnableInput") bool **EnableInput** `get` `set` *Whether this Browser Surface has Input enabled or not (interactable)* * Lua ```lua Space.Host.ExecutingObject.Browser.EnableInput = false ``` * Lua ```lua --the below scipt makes this object a clickable that toggle Enable Input a browser surface --(Example: Brower Enable Input toggle button ) --[Required: Browser surface object needs to be added as a reference to the Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject browser = Space.Host.GetReference("Browser Surface Object").Browser OnClick = function() if browser.EnableInput then browser.EnableInput = false Space.Log("Browser input disabled") else browser.EnableInput = true Space.Log("Browser input enabled") end end thisGameObject.AddClickable() thisGameObject.Clickable.Tooltip = "Click to Enable/Disable browser Input" thisGameObject.Clickable.OnClick(OnClick) ``` ##### Zoom[​](#zoom "Direct link to Zoom") float **Zoom** `get` `set` *Set the Zoom of the browser surface (Pixel Scaling). Positive values zoom in, negative values zoom out.* * Lua ```lua Space.Host.ExecutingObject.Browser.Zoom = 2 ``` * Lua ```lua --the below scipt make a slider control the zoom in of a browser surface --(Example: browser zoom controls) --[Required: This object needs a Browser and slider objects to be added as reference to references section in Scripting Runtime component] slider = Space.Host.GetReference("Slider").UISlider browser = Space.Host.GetReference("Browser") browser.Browser.SetURL("https://www.yahoo.com") OnValueChanged = function() browser.Browser.Zoom = slider.NormalizedValue * 5 end slider.OnValueChanged(OnValueChanged) ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Returns a reference to the GameObject of this component.* * Lua ```lua theGameObject = Space.Host.ExecutingObject.Browser.GameObject ``` --- ### SCamera #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | ------------------------------------------------------------------------------------------------------------- | | void [**TakePhoto** ](/scripting/client-scripting-api-reference/components/scamera.md#takephoto)() | | SResource [**TakeSnapshot** ](/scripting/client-scripting-api-reference/components/scamera.md#takesnapshot)() | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ------------------------------------------------------------------------------------------------------------------------------- | | bool [**HDR** ](/scripting/client-scripting-api-reference/components/scamera.md#hdr)`get` `set` | | int [**PixelWidth** ](/scripting/client-scripting-api-reference/components/scamera.md#pixelwidth)`get` | | int [**PixelHeight** ](/scripting/client-scripting-api-reference/components/scamera.md#pixelheight)`get` | | SVector [**Velocity** ](/scripting/client-scripting-api-reference/components/scamera.md#velocity)`get` | | bool [**UseOcclusionCulling** ](/scripting/client-scripting-api-reference/components/scamera.md#useocclusionculling)`get` `set` | | bool [**Enabled** ](/scripting/client-scripting-api-reference/components/scamera.md#enabled)`get` `set` | | float [**FieldOfView** ](/scripting/client-scripting-api-reference/components/scamera.md#fieldofview)`get` `set` | | bool [**Orthographic** ](/scripting/client-scripting-api-reference/components/scamera.md#orthographic)`get` `set` | | float [**OrthographicSize** ](/scripting/client-scripting-api-reference/components/scamera.md#orthographicsize)`get` `set` | | float [**NearClip** ](/scripting/client-scripting-api-reference/components/scamera.md#nearclip)`get` `set` | | float [**FarClip** ](/scripting/client-scripting-api-reference/components/scamera.md#farclip)`get` `set` | #### Functions[​](#functions "Direct link to Functions") ##### TakePhoto[​](#takephoto "Direct link to TakePhoto") void **TakePhoto** () *Triggers the Photo window in the UI, with the output of this camera. Perfect for photo booths.* * Lua ```lua Space.Host.ExecutingObject.Camera.TakePhoto() ``` ##### TakeSnapshot[​](#takesnapshot "Direct link to TakeSnapshot") [SResource](/scripting/client-scripting-api-reference/types/sresource.md) **TakeSnapshot** () *Captures a texture from the camera, and saves it in a SResource* * Lua ```lua Space.Host.ExecutingObject.Camera.TakeSnapshot() ``` #### Properties[​](#properties "Direct link to Properties") ##### HDR[​](#hdr "Direct link to HDR") bool **HDR** `get` `set` *Can this camera write HDR values? (i.e. values brighter than 1.0)* * Lua ```lua Space.Host.ExecutingObject.Camera.HDR = true ``` ##### PixelWidth[​](#pixelwidth "Direct link to PixelWidth") int **PixelWidth** `get` *The width of this Camera's texture, in pixels* * Lua ```lua cameraWidthPixels = Space.Host.ExecutingObject.Camera.PixelWidth ``` ##### PixelHeight[​](#pixelheight "Direct link to PixelHeight") int **PixelHeight** `get` *The height of this Camera's texture in pixels* * Lua ```lua cameraHeightPixels = Space.Host.ExecutingObject.Camera.PixelHeight ``` ##### Velocity[​](#velocity "Direct link to Velocity") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **Velocity** `get` World space speed of this camera, typically used for motion blur. * Lua ```lua cameraVelocity = Space.Host.ExecutingObject.Camera.Velocity ``` ##### UseOcclusionCulling[​](#useocclusionculling "Direct link to UseOcclusionCulling") bool **UseOcclusionCulling** `get` `set` *Is Occlusion Culling enabled on this camera?* * Lua ```lua Space.Host.ExecutingObject.Camera.UseOcclusionCulling = true ``` ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` *Is this camera enabled?* * Lua ```lua Space.Host.ExecutingObject.Camera.Enabled = true ``` * Lua ```lua --clicking this object will Enable/Disable it's Camera component thisGameObject = Space.Host.ExecutingObject component = thisGameObject.Camera OnClick = function() component.Enabled = not component.Enabled end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### FieldOfView[​](#fieldofview "Direct link to FieldOfView") float **FieldOfView** `get` `set` *The field of view of the camera, in typical scenarios, Sinespace uses a value of 52; however Unity will default to 60.* * Lua ```lua Space.Host.ExecutingObject.Camera.FieldOfView = 70 ``` ##### Orthographic[​](#orthographic "Direct link to Orthographic") bool **Orthographic** `get` `set` *Does this camera render without perspective?* * Lua ```lua Space.Host.ExecutingObject.Camera.Orthographic = true ``` ##### OrthographicSize[​](#orthographicsize "Direct link to OrthographicSize") float **OrthographicSize** `get` `set` *The width of the camera when in Orthographic mode. Height will be adjusted based on aspect ratio of the Render Texture* * Lua ```lua Space.Host.ExecutingObject.Camera.OrthographicSize = 5.0 ``` ##### NearClip[​](#nearclip "Direct link to NearClip") float **NearClip** `get` `set` *How close can an object be to the camera plane before it is not rendered?* * Lua ```lua Space.Host.ExecutingObject.Camera.NearClip = 2.0 ``` ##### FarClip[​](#farclip "Direct link to FarClip") float **FarClip** `get` `set` *How far is an object from the camera plane before it is not rendered?* * Lua ```lua Space.Host.ExecutingObject.Camera.FarClip = 6.0 ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Returns a reference to the GameObject of this component.* * Lua ```lua theGameObject = Space.Host.ExecutingObject.Camera.GameObject ``` --- ### SCanvasGroup #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ---------------------------------------------------------------------------------------------------------------------------------- | | float [**Alpha** ](/scripting/client-scripting-api-reference/components/scanvasgroup.md#alpha)`get` `set` | | bool [**BlocksRaycasts** ](/scripting/client-scripting-api-reference/components/scanvasgroup.md#blocksraycasts)`get` `set` | | bool [**IgnoreParentGroups** ](/scripting/client-scripting-api-reference/components/scanvasgroup.md#ignoreparentgroups)`get` `set` | | bool [**Interactable** ](/scripting/client-scripting-api-reference/components/scanvasgroup.md#interactable)`get` `set` | #### Properties[​](#properties "Direct link to Properties") ##### Alpha[​](#alpha "Direct link to Alpha") float **Alpha** `get` `set` S*et the alpha of the group.* * Lua ```lua Space.Host.CanvasGroup.Alpha = 1.0 ``` ##### BlocksRaycasts[​](#blocksraycasts "Direct link to BlocksRaycasts") bool **BlocksRaycasts** `get` `set` *Does this group block raycasting (allow collision)?* * Lua ```lua Space.Host.CanvasGroup.BlocksRaycasts = true ``` ##### IgnoreParentGroups[​](#ignoreparentgroups "Direct link to IgnoreParentGroups") bool **IgnoreParentGroups** `get` `set` *Should the group ignore parent groups?* * Lua ```lua Space.Host.CanvasGroup.IgnoreParentGroups = true ``` ##### Interactable[​](#interactable "Direct link to Interactable") bool **Interactable** `get` `set` *Is the group interactable (are the elements beneath the group enabled)?* * Lua ```lua Space.Host.CanvasGroup.Interactable = true ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Returns a reference to the GameObject of this component.* * Lua ```lua theGameObject = Space.Host.ExecutingObject.CanvasGroup.GameObject ``` --- ### SCapsuleCollider #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | -------------------------------------------------------------------------------------------------------------------- | | SVector [**Center** ](/scripting/client-scripting-api-reference/components/scapsulecollider.md#center)`get` `set` | | int [**Direction** ](/scripting/client-scripting-api-reference/components/scapsulecollider.md#direction)`get` `set` | | float [**Height** ](/scripting/client-scripting-api-reference/components/scapsulecollider.md#height)`get` `set` | | float [**Radius** ](/scripting/client-scripting-api-reference/components/scapsulecollider.md#radius)`get` `set` | | bool [**Enabled** ](/scripting/client-scripting-api-reference/components/scapsulecollider.md#enabled)`get` `set` | | bool [**IsTrigger** ](/scripting/client-scripting-api-reference/components/scapsulecollider.md#istrigger)`get` `set` | #### Properties[​](#properties "Direct link to Properties") ##### Center[​](#center "Direct link to Center") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **Center** `get` `set` *The center of the capsule, measured in the object's local space.* * Lua ```lua Center = Space.Host.ExecutingObject.CapsuleCollider.Center ``` * Lua ```lua --clicking this object moves it's Capsule Collider's center one unit upwards thisObject = Space.Host.ExecutingObject OnClick = function() center = thisObject.CapsuleCollider.Center thisObject.CapsuleCollider.Center = Vector.New(center.X,center.Y + 1, center.Z) end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### Direction[​](#direction "Direct link to Direction") int **Direction** `get` `set` *The direction of the capsule.* * Lua ```lua Direction = Space.Host.ExecutingObject.CapsuleCollider.Direction ``` * Lua ```lua --clicking this object increases it's Capsule Collider's direction by one unit thisObject = Space.Host.ExecutingObject OnClick = function() thisObject.CapsuleCollider.Direction thisObject.CapsuleCollider.Direction = thisObject.CapsuleCollider.Direction + 1 end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### Height[​](#height "Direct link to Height") float **Height** `get set` *The height of the capsule measured in the object's local space.* * Lua ```lua Space.Host.ExecutingObject.CapsuleCollider.Height = 5.0 ``` * Lua ```lua --clicking this object increases it's Capsule Collider's height by one unit thisObject = Space.Host.ExecutingObject OnClick = function() thisObject.CapsuleCollider.Height thisObject.CapsuleCollider.Height= thisObject.CapsuleCollider.Height+ 1.0 end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### Radius[​](#radius "Direct link to Radius") float **Radius** `get` `set` *The radius of the capsule.* * Lua ```lua Radius = Space.Host.ExecutingObject.CapsuleCollider.Radius ``` * Lua ```lua --clicking this object increments it's Capsule Collider's radius by one unit thisObject = Space.Host.ExecutingObject OnClick = function() thisObject.CapsuleCollider.Radius = thisObject.CapsuleCollider.Radius + 1 end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` *Enabled Colliders will collide with other Colliders, disabled Colliders won't.* * Lua ```lua Space.Host.ExecutingObject.CapsuleCollider.Enabled = false ``` * Lua ```lua --clicking this object toggles it's Capsule Collider On/Off thisObject = Space.Host.ExecutingObject OnClick = function() thisObject.CapsuleCollider.Enabled = not thisObject.CapsuleCollider.Enabled end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### IsTrigger[​](#istrigger "Direct link to IsTrigger") bool **IsTrigger** `get` `set` *Is the collider a trigger?* * Lua ```lua Space.Host.ExecutingObject.CapsuleCollider.IsTrigger = false ``` * Lua ```lua --clicking this object toggles it's Capsule Collider between being a Collider vs Trigger Collider thisObject = Space.Host.ExecutingObject OnClick = function() thisObject.CapsuleCollider.IsTrigger = not thisObject.CapsuleCollider.IsTrigger end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Returns a reference to the GameObject of this component.* * Lua ```lua theGameObject = Space.Host.ExecutingObject.CapsuleCollider.GameObject ``` --- ### SCharacterController #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | -------------------------------------------------------------------------------------------------------------------------------------------------------- | | SVector [**ClosestPointOnBounds** ](/scripting/client-scripting-api-reference/components/scharactercontroller.md#closestpointonbounds)(SVector position) | | SVector [**ClosestPoint** ](/scripting/client-scripting-api-reference/components/scharactercontroller.md#closestpointonbounds)(SVector position) | | bool [**SimpleMove** ](/scripting/client-scripting-api-reference/components/scharactercontroller.md#simplemove)(SVector speed) | | int [**Move** ](/scripting/client-scripting-api-reference/components/scharactercontroller.md#move)(SVector motion) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ------------------------------------------------------------------------------------------------------------------------------------------------ | | SVector [**Center** ](/scripting/client-scripting-api-reference/components/scharactercontroller.md#center)`get` `set` | | bool [**DetectCollisions** ](/scripting/client-scripting-api-reference/components/scharactercontroller.md#detectcollisions)`get` `set` | | bool [**EnableOverlapRecovery** ](/scripting/client-scripting-api-reference/components/scharactercontroller.md#enableoverlaprecovery)`get` `set` | | float [**Height** ](/scripting/client-scripting-api-reference/components/scharactercontroller.md#height)`get` `set` | | float [**MinMoveDistance** ](/scripting/client-scripting-api-reference/components/scharactercontroller.md#minmovedistance)`get` `set` | | float [**Radius** ](/scripting/client-scripting-api-reference/components/scharactercontroller.md#radius)`get` `set` | | float [**SkinWidth** ](/scripting/client-scripting-api-reference/components/scharactercontroller.md#skinwidth)`get` `set` | | float [**SlopeLimit** ](/scripting/client-scripting-api-reference/components/scharactercontroller.md#slopelimit)`get` `set` | | float [**StepOffset** ](/scripting/client-scripting-api-reference/components/scharactercontroller.md#stepoffset)`get` `set` | | SVector [**Velocity** ](/scripting/client-scripting-api-reference/components/scharactercontroller.md#velocity)`get` | #### Functions[​](#functions "Direct link to Functions") ##### ClosestPointOnBounds[​](#closestpointonbounds "Direct link to ClosestPointOnBounds") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **ClosestPointOnBounds** ([SVector](/scripting/client-scripting-api-reference/types/svector.md) position) *The closest point to the bounding box of the attached collider. This can be used to calculate hit points when applying explosion damage.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua closestPoint = Space.Host.ExecutingObject.CharacterController.ClosestPointOnBounds(Vector.New(0,0,0)) ``` ##### ClosestPoint[​](#closestpoint "Direct link to ClosestPoint") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **ClosestPoint** ([SVector](/scripting/client-scripting-api-reference/types/svector.md) position) *The point on the collider that is closest to the specified location.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua closestPoint = Space.Host.ExecutingObject.CharacterController.ClosestPoint = Vector.New(0,0,0) ``` ##### SimpleMove[​](#simplemove "Direct link to SimpleMove") bool **SimpleMove** ([SVector](/scripting/client-scripting-api-reference/types/svector.md) speed) *Moves the character with speed. Velocity along the y-axis is ignored. Speed is in units/s. Gravity is automatically applied.* *Returns if the character is grounded.* *It is recommended that you make only one call to Move or SimpleMove per frame.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua isGrounded = Space.Host.ExecutingObject.CharacterController.SimpleMove = Vector.New(100,0,0) ``` ##### Move[​](#move "Direct link to Move") int **Move** ([SVector](/scripting/client-scripting-api-reference/types/svector.md) motion) *Supplies the movement of a* [*SGameObject*](/scripting/client-scripting-api-reference/types/sgameobject.md) *with an attached SCharacterController component.* *The SCharacterController.Move motion moves the* [*SGameObject*](/scripting/client-scripting-api-reference/types/sgameobject.md) *in the given direction. The given direction requires absolute movement delta values. A collision constrains the Move from taking place.* *Returns an int indicating the direction of a collision: None (0), Sides (1), Above (2), and Below (3). SCharacterController.Move does not use gravity.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua collisionDirection = Space.Host.ExecutingObject.CharacterController.Move = Vector.New(100,0,0) ``` #### Properties[​](#properties "Direct link to Properties") ##### Center[​](#center "Direct link to Center") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **Center** `get` `set` *Returns Center Vector value of the Character Controller.* * Lua ```lua Space.Host.ExecutingObject.CharacterController.Center = Vector.New(0,0,0) ``` ##### DetectCollisions[​](#detectcollisions "Direct link to DetectCollisions") bool **DetectCollisions** `get` `set` *Determines whether other rigidbodies or character controllers collide with this character controller (by default this is always enabled).* *This method does not affect collisions detected during the character controller's movement but rather decides whether an incoming collider will be blocked by the controller's collider. For example, a box collider in the Scene will block the movement of the controller, but the box may still fall through the controller if detectCollisions is false. This property is useful to disable the character controller temporarily. For example, you might want to mount a character into a car and disable collision detection until it exits the car again.* * Lua ```lua Space.Host.CharacterController.DetectCollisions= false ``` * Lua ```lua --clicking this object will toggle a Character Controller's Detect Collisions property thisObject = Space.Host.ExecutingObject ccontroller = Space.Host.GetReference("thecharactercontroller").CharacterController --add Reference to Scripting Runtime function OnClickFunction() ccontroller.DetectCollisions = not ccontroller.DetectCollisions end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### EnableOverlapRecovery[​](#enableoverlaprecovery "Direct link to EnableOverlapRecovery") bool **EnableOverlapRecovery** `get` `set` *Enables or disables overlap recovery. Enables or disables overlap recovery. Used to depenetrate character controllers from static objects when an overlap is detected.* *Overlap recovery can be used to depenetrate character controllers (CCTs) from static objects when an overlap is detected. This can happen in three main cases:* *- when the CCT is directly spawned or teleported in another object* *- when the CCT algorithm fails due to limited FPU accuracy* *- when the "up vector" is modified, making the rotated CCT shape overlap surrounding objects* *When activated, the CCT module will automatically try to resolve the penetration, and move the CCT to a safe place where it does* *not overlap other objects anymore. This only concerns static objects, dynamic objects are ignored by overlap recovery.* *When overlap recovery is not activated, it is possible for the CCTs to go through static objects. By default, overlap recovery is enabled.* *Overlap recovery currently works with all geometries except heightfields.* * Lua ```lua Space.Host.CharacterController.EnableOverlapRecovery= false ``` * Lua ```lua --clicking this object will toggle a Character Controller's Enable Overlap Recovery property thisObject = Space.Host.ExecutingObject ccontroller = Space.Host.GetReference("thecharactercontroller").CharacterController --add Reference to Scripting Runtime function OnClickFunction() ccontroller.EnableOverlapRecovery = not ccontroller.EnableOverlapRecovery end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### Height[​](#height "Direct link to Height") float **Height** `get` `set` *The height of the character's capsule.* * Lua ```lua Space.Host.ExecutingObject.CharacterController.Height = 4 ``` * Lua ```lua --the below script will make a slider change a Character Controller Height property --[Add "theslider" and "thecharactercontroller" to the Object References section in Scripting Runtime component] slider = Space.Host.GetReference("theslider").UISlider ccontroller = Space.Host.GetReference("thecharactercontroller").CharacterController OVC = function() ccontroller.Height = (slider.Value * 10.0) -- from 0.0 to 10.0 end slider.OnValueChanged(OVC) ``` ##### MinMoveDistance[​](#minmovedistance "Direct link to MinMoveDistance") float **MinMoveDistance** `get` `set` *Gets or sets the minimum move distance of the character controller.* * Lua ```lua Space.Host.ExecutingObject.CharacterController.MinMoveDistance = 3 ``` * Lua ```lua --this script will make a slider change a Character Controller Min Move Distance property --[Add "theslider" and "thecharactercontroller" to the Object References section in Scripting Runtime component] slider = Space.Host.GetReference("theslider").UISlider ccontroller = Space.Host.GetReference("thecharactercontroller").CharacterController OVC = function() ccontroller.MinMoveDistance= (slider.Value * 10.0) -- from 0.0 to 10.0 end slider.OnValueChanged(OVC) ``` ##### Radius[​](#radius "Direct link to Radius") float **Radius** `get` `set` *The radius of the character's capsule.* * Lua ```lua Space.Host.ExecutingObject.CharacterController.Radius = 5 ``` * Lua ```lua --this script will make a slider change a Character Controller Radius property --[Add "theslider" and "thecharactercontroller" to the Object References section in Scripting Runtime component] slider = Space.Host.GetReference("theslider").UISlider ccontroller = Space.Host.GetReference("thecharactercontroller").CharacterController OVC = function() ccontroller.Radius= (slider.Value * 10.0) -- from 0.0 to 10.0 end slider.OnValueChanged(OVC) ``` ##### SkinWidth[​](#skinwidth "Direct link to SkinWidth") float **SkinWidth** `get` `set` *The character's collision skin width.* * Lua ```lua Space.Host.ExecutingObject.CharacterController.SkinWidth = 4 ``` * Lua ```lua --this script will make a slider change a Character Controller SkinWidth property --[Add "theslider" and "thecharactercontroller" to the Object References section in Scripting Runtime component] slider = Space.Host.GetReference("theslider").UISlider ccontroller = Space.Host.GetReference("thecharactercontroller").CharacterController OVC = function() ccontroller.SkinWidth= (slider.Value * 10.0) -- from 0.0 to 10.0 end slider.OnValueChanged(OVC) ``` ##### SlopeLimit[​](#slopelimit "Direct link to SlopeLimit") float **SlopeLimit** `get` `set` *The character controllers slope limit in degrees.* * Lua ```lua Space.Host.ExecutingObject.CharacterController.SlopeLimit= 2 ``` * Lua ```lua --this script will make a slider change a Character Controller Slope Limit property --[Add "theslider" and "thecharactercontroller" to the Object References section in Scripting Runtime component] slider = Space.Host.GetReference("theslider").UISlider ccontroller = Space.Host.GetReference("thecharactercontroller").CharacterController OVC = function() ccontroller.SlopeLimit= (slider.Value * 180.0) -- from 0.0 to 180.0 end slider.OnValueChanged(OVC) ``` ##### StepOffset[​](#stepoffset "Direct link to StepOffset") float **StepOffset** `get` `set` *The character controllers step offset in meters.* * Lua ```lua Space.Host.ExecutingObject.CharacterController.StepOffset= 2 ``` * Lua ```lua --this script will make a slider change a Character Controller Step Offset property --[Add "theslider" and "thecharactercontroller" to the Object References section in Scripting Runtime component] slider = Space.Host.GetReference("theslider").UISlider ccontroller = Space.Host.GetReference("thecharactercontroller").CharacterController OVC = function() ccontroller.StepOffset= (slider.Value * 10.0) -- from 0.0 to 10.0 end slider.OnValueChanged(OVC) ``` ##### Velocity[​](#velocity "Direct link to Velocity") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **Velocity** `get` *The current relative velocity of the Character.* * Lua ```lua currentRelativeVelocity = Space.Host.ExecutingObject.CharacterController.Velocity ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Returns a reference to the GameObject of this component.* * Lua ```lua theGameObject = Space.Host.ExecutingObject.CharacterController.GameObject ``` --- ### SClickable #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | ----------------------------------------------------------------------------------------------------------------------------------------------------- | | void [**AddExtraAction** ](/scripting/client-scripting-api-reference/components/sclickable.md#addextraaction)(string name, string tooltip, Closure e) | | void [**ClearActions** ](/scripting/client-scripting-api-reference/components/sclickable.md#clearactions)() | | void [**OnClick** ](/scripting/client-scripting-api-reference/components/sclickable.md#onclick)(Closure e) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ------------------------------------------------------------------------------------------------------------ | | bool [**Enabled** ](/scripting/client-scripting-api-reference/components/sclickable.md#enabled)`get` `set` | | string [**Tooltip** ](/scripting/client-scripting-api-reference/components/sclickable.md#tooltip)`get` `set` | | SGameObject **GameObject** `get` | #### Functions[​](#functions "Direct link to Functions") ##### AddExtraAction[​](#addextraaction "Direct link to AddExtraAction") void **AddExtraAction** (string name, string tooltip, Closure e) *Add a new action for the object to perform when clicked. Can be useful for providing miltuple choice of an action on click.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Clickable.AddExtraAction ("ButtonName", "Tooltip Text Here", AFunction) ``` ##### ClearActions[​](#clearactions "Direct link to ClearActions") void **ClearActions** () *Removes all actions from the clickable GameObject.* * Lua ```lua Space.Host.ExecutingObject.Clickable.ClearActions() ``` * Lua ```lua hostObject = Space.Host.ExecutingObject hostObject.AddClickable() function ClickMe () Space.Log("I was clicked!") end function ClickAndClear () Space.Log("No more actions!") hostObject.Clickable.ClearActions () end hostObject.Clickable.AddExtraAction ("LogButton", "Prints I was clicked! to the console", ClickMe) hostObject.Clickable.AddExtraAction ("ClearButton", "Clears all actions", ClickAndClear) -- Now, when the latter option is chosen, the script clears the Clickable component of all actions. ``` ##### OnClick[​](#onclick "Direct link to OnClick") void **OnClick** (Closure e) *When clicked, the GameObject performs the required action.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Clickable.OnClick(AFunction) ``` * Lua ```lua hostObject = Space.Host.ExecutingObject hostObject.AddClickable() deltaPos = Vector.New(0,0,1) function MakeMeMove () hostObject.WorldPosition = hostObject.WorldPosition + deltaPos end hostObject.Clickable.OnClick (MakeMeMove); -- Now, every time an object is clicked, it moves by 1 in the positive Z direction. ``` #### Properties[​](#properties "Direct link to Properties") ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` *Enable or disable the clickable component from a GameObject.* * Lua ```lua Space.Host.ExecutingObject.Clickable.Enabled = false ``` * Lua ```lua --Clicking the object will disable the component, making it only clickable once thisGameObject = Space.Host.ExecutingObject OnClick = function() thisGameObject.Clickable.Enabled = false end thisGameObject.AddClickable() thisGameObject.Clickable.Tooltip = "Click to activate" thisGameObject.Clickable.OnClick(OnClick) ``` ##### Tooltip[​](#tooltip "Direct link to Tooltip") string **Tooltip** `get` `set` *A hint that pops up when the mouse is hovering over the GameObject.* * Lua ```lua Space.Host.ExecutingObject.Clickable.Tooltip = "test" ``` * Lua ```lua --Clicking the object will toggle between two different tooltips thisGameObject = Space.Host.ExecutingObject OnClick = function() if thisGameObject.Clickable.Tooltip == "Turn On" then thisGameObject.Clickable.Tooltip = "Turn Off" else thisGameObject.Clickable.Tooltip = "Turn On" end end thisGameObject.AddClickable() thisGameObject.Clickable.Tooltip = "Turn On" thisGameObject.Clickable.OnClick(OnClick) ``` ##### GameObject[​](#gameobject "Direct link to GameObject") SGameObject **GameObject** `get` *Returns a reference to the GameObject of this component.* * Lua ```lua theGameObject = Space.Host.ExecutingObject.Clickable.GameObject ``` --- ### SCloth #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ------------------------------------------------------------------------------------------------------------------------------------------ | | float [**BendingStiffness** ](/scripting/client-scripting-api-reference/components/scloth.md#bendingstiffness)`get` `set` | | float [**CollisionMassScale** ](/scripting/client-scripting-api-reference/components/scloth.md#collisionmassscale)`get` `set` | | bool [**EnableContinuousCollision** ](/scripting/client-scripting-api-reference/components/scloth.md#enablecontinuouscollision)`get` `set` | | bool [**Enabled** ](/scripting/client-scripting-api-reference/components/scloth.md#enabled)`get` `set` | | SVector [**ExternalAcceleration** ](/scripting/client-scripting-api-reference/components/scloth.md#externalacceleration)`get` `set` | | float [**Friction** ](/scripting/client-scripting-api-reference/components/scloth.md#friction)`get` `set` | | SVector [**RandomAcceleration** ](/scripting/client-scripting-api-reference/components/scloth.md#randomacceleration)`get` `set` | | float [**StretchingStiffness** ](/scripting/client-scripting-api-reference/components/scloth.md#stretchingstiffness)`get` `set` | | bool [**UseGravity** ](/scripting/client-scripting-api-reference/components/scloth.md#usegravity)`get` `set` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/scloth.md#gameobject)`get` | #### Properties[​](#properties "Direct link to Properties") ##### BendingStiffness[​](#bendingstiffness "Direct link to BendingStiffness") float **BendingStiffness** `get` `set` *Bending stiffness of cloth.* * Lua ```lua Space.Host.ExecutingObject.Cloth.BendingStiffness = 0.5 ``` ##### CollisionMassScale[​](#collisionmassscale "Direct link to CollisionMassScale") float **CollisionMassScale** `get` `set` *Increase the mass of colliding particles.* * Lua ```lua Space.Host.ExecutingObject.Cloth.CollisionMassScale = 0.5 ``` ##### EnableContinuousCollision[​](#enablecontinuouscollision "Direct link to EnableContinuousCollision") bool **EnableContinuousCollision** `get` `set` *Enable continuous collision to improve collision stability.* * Lua ```lua Space.Host.ExecutingObject.Cloth.EnableContinuousCollision = true ``` ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` *Enable or disable components.* * Lua ```lua Space.Host.ExecutingObject.Cloth.Enabled = false ``` * Lua ```lua --clicking this object will Enable/Disable it's Cloth component thisGameObject = Space.Host.ExecutingObject component = thisGameObject.Cloth OnClick = function() component.Enabled = not component.Enabled end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### ExternalAcceleration[​](#externalacceleration "Direct link to ExternalAcceleration") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **ExternalAcceleration** `get` `set` *A constant external acceleration applied to the cloth.* * Lua ```lua Space.Host.ExecutingObject.Cloth.ExternalAcceleration = Vector.New(2,4,5) ``` ##### Friction[​](#friction "Direct link to Friction") float **Friction** `get` `set` *Return the friction of the cloth when colliding with the character.* * Lua ```lua Space.Host.ExecutingObject.Cloth.Friction = 0.8 ``` ##### RandomAcceleration[​](#randomacceleration "Direct link to RandomAcceleration") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **RandomAcceleration** `get` `set` *A constant external acceleration applied to the cloth.* * Lua ```lua Space.Host.ExecutingObject.Cloth.RandomAcceleration = Vector.New(2,4,5) ``` ##### StretchingStiffness[​](#stretchingstiffness "Direct link to StretchingStiffness") float **StretchingStiffness** `get` `set` *Stretching stiffness of the cloth.* * Lua ```lua Space.Host.ExecutingObject.Cloth.StretchingStiffness = 0.6 ``` ##### UseGravity[​](#usegravity "Direct link to UseGravity") bool **UseGravity** `get` `set` *Stretching stiffness of the cloth.* * Lua ```lua Space.Host.ExecutingObject.Cloth.UseGravity = true ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua ```lua theGameObject = Space.Host.ExecutingObject.Cloth.GameObject ``` --- ### SCollider #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ---------------------------------------------------------------------------------------------------------------- | | bool [**Enabled** ](/scripting/client-scripting-api-reference/components/scollider.md#enabled)`get` `set` | | bool [**IsTrigger** ](/scripting/client-scripting-api-reference/components/scollider.md#istrigger)`get` `set` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/scollider.md#gameobject)`get` | #### Properties[​](#properties "Direct link to Properties") ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` *Enable or disable the collider.* * Lua ```lua Space.Host.ExecutingObject.Collider.Enabled= false ``` * Lua ```lua --clicking this object toggles it's Collider On/Off thisObject = Space.Host.ExecutingObject OnClick = function() thisObject.Collider.Enabled = not thisObject.Collider.Enabled end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### IsTrigger[​](#istrigger "Direct link to IsTrigger") bool **IsTrigger** `get` `set` *Set Collider as a trigger.* * Lua ```lua Space.Host.ExecutingObject.Collider.IsTrigger = true ``` * Lua ```lua --clicking this object toggles it's collider between being a Collider vs Trigger Collider thisObject = Space.Host.ExecutingObject OnClick = function() thisObject.Collider.IsTrigger = not thisObject.Collider.IsTrigger end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua ```lua theGameObject = Space.Host.ExecutingObject.Collider.GameObject ``` --- ### SContentSizeFitter #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | --------------------------------------------------------------------------------------------------------------------------------- | | void [**SetLayoutHorizontal** ](/scripting/client-scripting-api-reference/components/scontentsizefitter.md#setlayouthorizontal)() | | void [**SetLayoutVertical** ](/scripting/client-scripting-api-reference/components/scontentsizefitter.md#setlayoutvertical)() | | void [**RefreshLayout** ](/scripting/client-scripting-api-reference/components/scontentsizefitter.md#refreshlayout)() | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ------------------------------------------------------------------------------------------------------------------------- | | bool [**Enable** ](/scripting/client-scripting-api-reference/components/scontentsizefitter.md#enable)`get` `set` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/scontentsizefitter.md#gameobject)`get` | #### Functions[​](#functions "Direct link to Functions") ##### SetLayoutHorizontal[​](#setlayouthorizontal "Direct link to SetLayoutHorizontal") void **SetLayoutHorizontal** () *Function Description* * Lua ```lua Space.Host.ExecutingObject.ContentSizeFitter.SetLayoutHorizontal() ``` ##### SetLayoutVertical[​](#setlayoutvertical "Direct link to SetLayoutVertical") void **SetLayoutVertical** () *Function Description* * Lua ```lua Space.Host.ExecutingObject.ContentSizeFitter.SetLayoutVertical() ``` ##### RefreshLayout[​](#refreshlayout "Direct link to RefreshLayout") void **RefreshLayout** () *Function Description* * Lua ```lua Space.Host.ExecutingObject.ContentSizeFitter.RefreshLayout() ``` #### Properties[​](#properties "Direct link to Properties") ##### Enable[​](#enable "Direct link to Enable") bool **Enable** `get` `set` *Property Description* * Lua ```lua Space.Host.ExecutingObject.ContentSizeFitter.Enable = true ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua ```lua theGameObject = Space.Host.ExecutingObject.ContentSizeFitter.GameObject ``` --- ### SEmbeddedVideo #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | --------------------------------------------------------------------------------------------------------------------------- | | void [**OnStateChange** ](/scripting/client-scripting-api-reference/components/sembeddedvideo.md#onstatechange)(Closure e) | | void [**Play** ](/scripting/client-scripting-api-reference/components/sembeddedvideo.md#play)() | | void [**Stop** ](/scripting/client-scripting-api-reference/components/sembeddedvideo.md#stop)() | | void [**Pause** ](/scripting/client-scripting-api-reference/components/sembeddedvideo.md#pause)() | | void [**Resume** ](/scripting/client-scripting-api-reference/components/sembeddedvideo.md#resume)() | | void [**SynchorizeUrl** ](/scripting/client-scripting-api-reference/components/sembeddedvideo.md#synchorizeurl)() | | void [**ClearRenderTexture** ](/scripting/client-scripting-api-reference/components/sembeddedvideo.md#clearrendertexture)() | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ------------------------------------------------------------------------------------------------------------------------------ | | SEmbeddedVideoState [**State** ](/scripting/client-scripting-api-reference/components/sembeddedvideo.md#state)`get` | | string [**URL** ](/scripting/client-scripting-api-reference/components/sembeddedvideo.md#url)`get` `set` | | SAudioSource [**AudioSource** ](/scripting/client-scripting-api-reference/components/sembeddedvideo.md#audiosource)`get` `set` | | SResource [**OutputTexture** ](/scripting/client-scripting-api-reference/components/sembeddedvideo.md#outputtexture)`get` | | SResource [**Texture** ](/scripting/client-scripting-api-reference/components/sembeddedvideo.md#texture)`get` | | double [**Time** ](/scripting/client-scripting-api-reference/components/sembeddedvideo.md#time)`get` `set` | | long [**Position** ](/scripting/client-scripting-api-reference/components/sembeddedvideo.md#position)`get` | | string [**UniqueName** ](/scripting/client-scripting-api-reference/components/sembeddedvideo.md#uniquename)`get` | | double [**VideoLength** ](/scripting/client-scripting-api-reference/components/sembeddedvideo.md#videolength)`get` | | bool [**Loop** ](/scripting/client-scripting-api-reference/components/sembeddedvideo.md#loop)`get` `set` | | int [**FrameCount** ](/scripting/client-scripting-api-reference/components/sembeddedvideo.md#framecount)`get` | | bool [**IsPlaying** ](/scripting/client-scripting-api-reference/components/sembeddedvideo.md#isplaying)`get` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/sembeddedvideo.md#gameobject)`get` | #### Functions[​](#functions "Direct link to Functions") ##### OnStateChange[​](#onstatechange "Direct link to OnStateChange") void **OnStateChange** (Closure e) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua function stateChangeFunction(EmbeddedVideo, oldState, newState) --what happens on state change end Space.Host.ExecutingObject.EmbeddedVideo.OnStageChange(stateChangeFunction) ``` * Lua ```lua --get embedded video component on your video player video = Space.Scene.Find("VidepPlayer").EmbeddedVideo function GetClosure() return function (a,b,c) log(a.URL..b..c) end end video.OnStateChange(GetClosure()) video.Pause() ``` ##### Play[​](#play "Direct link to Play") void **Play** () *If URL is set, plays the video* * Lua ```lua Space.Host.ExecutingObject.EmbeddedVideo.Play() ``` ##### Stop[​](#stop "Direct link to Stop") void **Stop** () *Stops the playback* * Lua ```lua Space.Host.ExecutingObject.EmbeddedVideo.Stop() ``` ##### Pause[​](#pause "Direct link to Pause") void **Pause** () *Pauses currently played video* * Lua ```lua Space.Host.ExecutingObject.EmbeddedVideo.Pause() ``` ##### Resume[​](#resume "Direct link to Resume") void **Resume** () *If the video is currently paused, it will resume playback* * Lua ```lua Space.Host.ExecutingObject.EmbeddedVideo.Resume() ``` ##### SynchorizeUrl[​](#synchorizeurl "Direct link to SynchorizeUrl") void **SynchorizeUrl** () *Synchorize current video* URL * Lua ```lua Space.Host.ExecutingObject.EmbeddedVideo.SynchorizeUrl() ``` ##### ClearRenderTexture[​](#clearrendertexture "Direct link to ClearRenderTexture") void **ClearRenderTexture** () *Clears the Render Texture* * Lua ```lua Space.Host.ExecutingObject.EmbeddedVideo.ClearRenderTexture() ``` #### Properties[​](#properties "Direct link to Properties") ##### State[​](#state "Direct link to State") [SEmbeddedVideoState](/scripting/client-scripting-api-reference/components/sembeddedvideo.md) **State** `get` *The state player is currently in. You can track state changes through StateChangeEvent.* * Lua ```lua CurrentVideoState = Space.Host.ExecutingObject.EmbeddedVideo.State ``` ##### URL[​](#url "Direct link to URL") string **URL** `get` `set` *Current URL set for this Player.* * Lua ```lua CurrentURL = Space.Host.ExecutingObject.EmbeddedVideo.URL ``` ##### AudioSource[​](#audiosource "Direct link to AudioSource") [SAudioSource](/scripting/client-scripting-api-reference/components/saudiosource.md) **AudioSource** `get` `set` *Current AudioSource* * Lua ```lua CurrentAudioSource = Space.Host.ExecutingObject.EmbeddedVideo.AudioSource ``` ##### OutputTexture[​](#outputtexture "Direct link to OutputTexture") [SResource](/scripting/client-scripting-api-reference/types/sresource.md) **OutputTexture** `get` *Property Description* * Lua ```lua OutputTexture = Space.Host.ExecutingObject.EmbeddedVideo.OutputTexture ``` ##### Texture[​](#texture "Direct link to Texture") [SResource](/scripting/client-scripting-api-reference/types/sresource.md) **Texture** `get` *Texture which the player uses to display the video.* * Lua ```lua Texture = Space.Host.ExecutingObject.EmbeddedVideo.Texture ``` ##### Time[​](#time "Direct link to Time") double **Time** `get` `set` *Current player time. Can be set to move the 'playhead' to the specific position.* * Lua ```lua Time = Space.Host.ExecutingObject.EmbeddedVideo.Time ``` ##### Position[​](#position "Direct link to Position") long **Position** `get` *Current Video Frame Position* * Lua ```lua Position = Space.Host.ExecutingObject.EmbeddedVideo.Position ``` ##### UniqueName[​](#uniquename "Direct link to UniqueName") string **UniqueName** `get` *Property Description* * Lua ```lua UniqueName = Space.Host.ExecutingObject.EmbeddedVideo.UniqueName ``` ##### VideoLength[​](#videolength "Direct link to VideoLength") double **VideoLength** `get` *Get the length of the video* * Lua ```lua VideoLength = Space.Host.ExecutingObject.EmbeddedVideo.VideoLength ``` ##### Loop[​](#loop "Direct link to Loop") bool **Loop** `get` `set` *Whether video is set to loop or not* * Lua ```lua Space.Host.ExecutingObject.EmbeddedVideo.Loop = true ``` ##### FrameCount[​](#framecount "Direct link to FrameCount") int **FrameCount** `get` *Returns the frame count of the video* * Lua ```lua FrameCount = Space.Host.ExecutingObject.EmbeddedVideo.FrameCount ``` ##### IsPlaying[​](#isplaying "Direct link to IsPlaying") bool **IsPlaying** `get` *Returns whether the video is playing or not* * Lua ```lua IsPlaying = Space.Host.ExecutingObject.EmbeddedVideo.IsPlaying ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua ```lua theGameObject = Space.Host.ExecutingObject.EmbeddedVideo.GameObject ``` --- ### SEventCalendar #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | ----------------------------------------------------------------------------------------------------------------------------------- | | void [**SwitchEventType** ](/scripting/client-scripting-api-reference/components/seventcalendar.md#switcheventtype)(int typeNumber) | | void [**ChangeRange** ](/scripting/client-scripting-api-reference/components/seventcalendar.md#changerange)(int range) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | --------------------------------------------------------------------------------------------------------------------- | | int [**Range** ](/scripting/client-scripting-api-reference/components/seventcalendar.md#range)`get` `set` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/seventcalendar.md#gameobject)`get` | #### Functions[​](#functions "Direct link to Functions") ##### SwitchEventType[​](#switcheventtype "Direct link to SwitchEventType") void **SwitchEventType** (int typeNumber) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.EventCalendar.SwitchEventType(1) ``` ##### ChangeRange[​](#changerange "Direct link to ChangeRange") void **ChangeRange** (int range) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.EventCalendar.ChangeRange(3) ``` #### Properties[​](#properties "Direct link to Properties") ##### Range[​](#range "Direct link to Range") int **Range** `get` `set` *Property Description* * Lua ```lua Space.Host.ExecutingObject.EventCalendar.Range = 3 ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua ```lua theGameObject = Space.Host.ExecutingObject.EventCalendar.GameObject ``` --- ### SFurniture #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | ----------------------------------------------------------------------------------------------------------------------------------------- | | void [**StoreCustomData** ](/scripting/client-scripting-api-reference/components/sfurniture.md#storecustomdata)(string key, string value) | | string [**GetCustomData** ](/scripting/client-scripting-api-reference/components/sfurniture.md#getcustomdata)(string key) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ------------------------------------------------------------------------------------------------------------------- | | int [**InventoryItemID** ](/scripting/client-scripting-api-reference/components/sfurniture.md#inventoryitemid)`get` | | SRoomFloor [**Floor** ](/scripting/client-scripting-api-reference/components/sfurniture.md#floor)`get` | | SCollider [**MainCollider** ](/scripting/client-scripting-api-reference/components/sfurniture.md#maincollider)`get` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/sfurniture.md#gameobject)`get` | #### Functions[​](#functions "Direct link to Functions") ##### StoreCustomData[​](#storecustomdata "Direct link to StoreCustomData") void **StoreCustomData** (string key, string value) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Furniture.StoreCustomData("AKey", "AValue") ``` ##### GetCustomData[​](#getcustomdata "Direct link to GetCustomData") string **GetCustomData** (string key) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua theValue = Space.Host.ExecutingObject.Furniture.GetCustomData("AKey") ``` #### Properties[​](#properties "Direct link to Properties") ##### InventoryItemID[​](#inventoryitemid "Direct link to InventoryItemID") int **InventoryItemID** `get` *Return the inventory ID of furniture.* * Lua ```lua inventoryID = Space.Host.ExecutingObject.Furniture.InventoryItemID ``` ##### Floor[​](#floor "Direct link to Floor") [SRoomFloor](/scripting/client-scripting-api-reference/components/sroomfloor.md) **Floor** `get` *Return an SRoomFloor component of the floor this furniture is placed on.* * Lua ```lua sRoomFloor = Space.Host.ExecutingObject.Furniture.Floor ``` ##### MainCollider[​](#maincollider "Direct link to MainCollider") [SCollider](/scripting/client-scripting-api-reference/components/scollider.md) **MainCollider** `get` *Property Description* * Lua ```lua collider = Space.Host.ExecutingObject.Furniture.MainCollider ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua ```lua theGameObject = Space.Host.ExecutingObject.Furniture.GameObject ``` --- ### SGraphicRaycaster #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | -------------------------------------------------------------------------------------------------------------------- | | SUIRaycastResult [**Raycast** ](/scripting/client-scripting-api-reference/components/sgraphicraycaster.md#raycast)() | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ---------------------------------------------------------------------------------------------------------------------------------- | | int [**SortOrderPriority** ](/scripting/client-scripting-api-reference/components/sgraphicraycaster.md#sortorderpriority)`get` | | int [**RenderOrderPriority** ](/scripting/client-scripting-api-reference/components/sgraphicraycaster.md#renderorderpriority)`get` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/sgraphicraycaster.md#gameobject)`get` | #### Functions[​](#functions "Direct link to Functions") ##### Raycast[​](#raycast "Direct link to Raycast") [SUIRaycastResult](/scripting/client-scripting-api-reference/types/suiraycastresult.md) **Raycast** () *Perform the raycast against the list of graphics associated with the Canvas and returns first UI raycast result.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua raycastResult = Space.Host.ExecutingObject.GraphicRaycaster.Raycast() ``` * Lua ```lua local trans = Space.Host.ExecutingObject local canvas = Space.Host.GetReference("Canvas") local gr = canvas.GraphicRaycaster function Update() local raycast = gr.Raycast() Space.Log(raycast.ToString()) end trans.OnUpdate(Update) ``` #### Properties[​](#properties "Direct link to Properties") ##### SortOrderPriority[​](#sortorderpriority "Direct link to SortOrderPriority") int **SortOrderPriority** `get` *Priority of the raycaster based upon render orderPriority of the raycaster based upon sort order.* * Lua ```lua Space.Host.ExecutingObject.GraphicRaycaster.SortOrderPriority= 1 ``` ##### RenderOrderPriority[​](#renderorderpriority "Direct link to RenderOrderPriority") int **RenderOrderPriority** `get` *Priority of the raycaster based upon render order.* * Lua ```lua Space.Host.ExecutingObject.GraphicRaycaster.RenderOrderPriority = 1 ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua ```lua theGameObject = Space.Host.ExecutingObject.GraphicRaycaster.GameObject ``` --- ### SHingeJoint #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ----------------------------------------------------------------------------------------------------------------------------------------------------- | | SRigidbody [**ConnectedBody** ](/scripting/client-scripting-api-reference/components/shingejoint.md#connectedbody)`get` `set` | | SVector [**Axis** ](/scripting/client-scripting-api-reference/components/shingejoint.md#axis)`get` `set` | | SVector [**Anchor** ](/scripting/client-scripting-api-reference/components/shingejoint.md#anchor)`get` `set` | | SVector [**ConnectedAnchor** ](/scripting/client-scripting-api-reference/components/shingejoint.md#connectedanchor)`get` `set` | | bool [**AutoConfigureConnectedAnchor** ](/scripting/client-scripting-api-reference/components/shingejoint.md#autoconfigureconnectedanchor)`get` `set` | | float [**BreakForce** ](/scripting/client-scripting-api-reference/components/shingejoint.md#breakforce)`get` `set` | | float [**BreakTorque** ](/scripting/client-scripting-api-reference/components/shingejoint.md#breaktorque)`get` `set` | | bool [**EnableCollision** ](/scripting/client-scripting-api-reference/components/shingejoint.md#enablecollision)`get` `set` | | bool [**EnablePreprocessing** ](/scripting/client-scripting-api-reference/components/shingejoint.md#enablepreprocessing)`get` `set` | | SVector [**CurrentForce** ](/scripting/client-scripting-api-reference/components/shingejoint.md#currentforce)`get` | | SVector [**CurrentTorque** ](/scripting/client-scripting-api-reference/components/shingejoint.md#currenttorque)`get` | | float [**MassScale** ](/scripting/client-scripting-api-reference/components/shingejoint.md#massscale)`get` `set` | | float [**ConnectedMassScale** ](/scripting/client-scripting-api-reference/components/shingejoint.md#connectedmassscale)`get` `set` | | SJointMotor [**Motor** ](/scripting/client-scripting-api-reference/components/shingejoint.md#motor)`get` `set` | | SJointLimits [**Limits** ](/scripting/client-scripting-api-reference/components/shingejoint.md#limits)`get` `set` | | SJointSpring [**Spring** ](/scripting/client-scripting-api-reference/components/shingejoint.md#spring)`get` `set` | | bool [**UseMotor** ](/scripting/client-scripting-api-reference/components/shingejoint.md#usemotor)`get` `set` | | bool [**UseLimits** ](/scripting/client-scripting-api-reference/components/shingejoint.md#uselimits)`get` `set` | | bool [**UseSpring** ](/scripting/client-scripting-api-reference/components/shingejoint.md#usespring)`get` `set` | | float [**Velocity** ](/scripting/client-scripting-api-reference/components/shingejoint.md#velocity)`get` | | float [**Angle** ](/scripting/client-scripting-api-reference/components/shingejoint.md#angle)`get` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/shingejoint.md#gameobject)`get` | #### Properties[​](#properties "Direct link to Properties") ##### ConnectedBody[​](#connectedbody "Direct link to ConnectedBody") [SRigidbody](/scripting/client-scripting-api-reference/components/srigidbody.md) **ConnectedBody** `get` `set` *Set joint to a rigidbody. If not set, the joint connects to the world.* * Lua ```lua connectedRigidBody = Space.Host.ExecutingObject.HingeJoint.ConnectedBody ``` ##### Axis[​](#axis "Direct link to Axis") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **Axis** `get` `set` *The direction of the axis around which the body swings. The direction is defined in local space.* * Lua ```lua Space.Host.ExecutingObject.HingeJoint.Axis = Vector.New(0,1,0) ``` ##### Anchor[​](#anchor "Direct link to Anchor") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **Anchor** `get` `set` *The position of the axis around which the body swings. The position is defined in local space.* * Lua ```lua Space.Host.ExecutingObject.HingeJoint.Anchor = Vector.New(0, 0.5 , 0) ``` ##### ConnectedAnchor[​](#connectedanchor "Direct link to ConnectedAnchor") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **ConnectedAnchor** `get` `set` *Manual configuration of the connected anchor position.* * Lua ```lua Space.Host.ExecutingObject.HingeJoint.ConnectedAnchor = Vector.New(1,1,1) ``` ##### AutoConfigureConnectedAnchor[​](#autoconfigureconnectedanchor "Direct link to AutoConfigureConnectedAnchor") bool **AutoConfigureConnectedAnchor** `get` `set` *If this is enabled, then the Connected Anchor position will be calculated automatically to match the global position of the anchor property. This is the default behavior. If this is disabled, you can configure the position of the connected anchor manually.* * Lua ```lua Space.Host.ExecutingObject.HingeJoint.AutoConfigureConnectedAnchor = false ``` ##### BreakForce[​](#breakforce "Direct link to BreakForce") float **BreakForce** `get` `set` *Apply the force to break the joint.* * Lua ```lua Space.Host.ExecutingObject.HingeJoint.BreakForce = 20 ``` ##### BreakTorque[​](#breaktorque "Direct link to BreakTorque") float **BreakTorque** `get` `set` *Apply the torque to break the joint.* * Lua ```lua Space.Host.ExecutingObject.HingeJoint.BreakTorque = 1 ``` ##### EnableCollision[​](#enablecollision "Direct link to EnableCollision") bool **EnableCollision** `get` `set` *When checked, this enables collisions between bodies connected with a joint.* * Lua ```lua Space.Host.ExecutingObject.HingeJoint.EnableCollision = true ``` ##### EnablePreprocessing[​](#enablepreprocessing "Direct link to EnablePreprocessing") bool **EnablePreprocessing** `get` `set` *Disabling preprocessing helps to stabilize impossible-to-fulfil configurations.* * Lua ```lua Space.Host.ExecutingObject.HingeJoint.EnablePreprocessing = true ``` ##### CurrentForce[​](#currentforce "Direct link to CurrentForce") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **CurrentForce** `get` *The force applied by the solver to satisfy all constraints.* * Lua ```lua vectorForce = Space.Host.ExecutingObject.HingeJoint.CurrentForce ``` ##### CurrentTorque[​](#currenttorque "Direct link to CurrentTorque") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **CurrentTorque** `get` *The torque applied by the solver to satisfy all constraints.* * Lua ```lua vectorTorque = Space.Host.ExecutingObject.HingeJoint.CurrentTorque ``` ##### MassScale[​](#massscale "Direct link to MassScale") float **MassScale** `get` `set` *The scale to apply to the inverse mass and inertia tensor of the body* * Lua ```lua Space.Host.ExecutingObject.HingeJoint.MassScale = 2 ``` ##### ConnectedMassScale[​](#connectedmassscale "Direct link to ConnectedMassScale") float **ConnectedMassScale** `get` `set` *The scale to apply to the inverse mass and inertia tensor of the connected body* * Lua ```lua Space.Host.ExecutingObject.HingeJoint.ConnectedMassScale = 2 ``` ##### Motor[​](#motor "Direct link to Motor") [SJointMotor](/scripting/client-scripting-api-reference/types/sjointmotor.md) **Motor** `get` `set` *The motor makes the object spin around.* * Lua ```lua jointMotor = Space.Host.ExecutingObject.HingeJoint.Motor ``` ##### Limits[​](#limits "Direct link to Limits") [SJointLimits](/scripting/client-scripting-api-reference/types/sjointlimits.md) **Limits** `get` `set` *The motor makes the object spin around.* * Lua ```lua jointLimits = Space.Host.ExecutingObject.HingeJoint.Limits ``` ##### Spring[​](#spring "Direct link to Spring") [SJointSpring](/scripting/client-scripting-api-reference/types/sjointspring.md) **Spring** `get` `set` *The motor makes the object spin around.* * Lua ```lua jointSpring = Space.Host.ExecutingObject.HingeJoint.Spring ``` ##### UseMotor[​](#usemotor "Direct link to UseMotor") bool **UseMotor** `get` `set` *The motor makes the object spin around.* * Lua ```lua Space.Host.ExecutingObject.HingeJoint.UseMotor = true ``` ##### UseLimits[​](#uselimits "Direct link to UseLimits") bool **UseLimits** `get` `set` *If enabled, the angle of the hinge will be restricted within the Min & Max values.* * Lua ```lua Space.Host.ExecutingObject.HingeJoint.UseLimits = true ``` ##### UseSpring[​](#usespring "Direct link to UseSpring") bool **UseSpring** `get` `set` *Spring makes the Rigidbody reach for a specific angle compared to its connected body.* * Lua ```lua Space.Host.ExecutingObject.HingeJoint.UseSpring = true ``` ##### Velocity[​](#velocity "Direct link to Velocity") float **Velocity** `get` *The angular velocity of the joint in degrees per second.* * Lua ```lua floatVelocity = Space.Host.ExecutingObject.HingeJoint.Velocity ``` ##### Angle[​](#angle "Direct link to Angle") float **Angle** `get` *The current angle in degrees of the joint relative to its rest position.* * Lua ```lua floatAngle = Space.Host.ExecutingObject.HingeJoint.Angle ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua ```lua theGameObject = Space.Host.ExecutingObject.HingeJoint.GameObject ``` --- ### SLight #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ------------------------------------------------------------------------------------------------------------- | | bool [**Enabled** ](/scripting/client-scripting-api-reference/components/slight.md#enabled)`get` `set` | | float [**Range** ](/scripting/client-scripting-api-reference/components/slight.md#range)`get` `set` | | float [**SpotAngle** ](/scripting/client-scripting-api-reference/components/slight.md#spotangle)`get` `set` | | float [**Intensity** ](/scripting/client-scripting-api-reference/components/slight.md#intensity)`get` `set` | | SVector [**Color** ](/scripting/client-scripting-api-reference/components/slight.md#color)`get` `set` | | SLightType [**Type** ](/scripting/client-scripting-api-reference/components/slight.md#type)`get` `set` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/slight.md#gameobject)`get` | #### Properties[​](#properties "Direct link to Properties") ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` *Enable/Disable this light.* * Lua ```lua Space.Host.ExecutingObject.Light.Enabled = false ``` * Lua ```lua --the below script will make the object Enable/Disable it's Light component --[Add "light" reference to the Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject light = Space.Host.GetReference("light").Light OnClick = function() light.Enabled = not light.Enabled end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### Range[​](#range "Direct link to Range") float **Range** `get` `set` *Get/Set the effective range of the light source.* * Lua ```lua Space.Host.ExecutingObject.Light.Range = 8.0 ``` * Lua ```lua --the below script will make a slider set the Light's range --[Add "slider" and "light" references to the Scripting Runtime component] light = Space.Host.GetReference("light").Light slider = Space.Host.GetReference("slider").UISlider OVC = function() light.Range = (slider.Value * 100) --(from 0 to 100) end slider.OnValueChanged(OVC) ``` ##### SpotAngle[​](#spotangle "Direct link to SpotAngle") float **SpotAngle** `get` `set` *The angle of the light's spotlight cone in degrees.* * Lua ```lua Space.Host.ExecutingObject.Light.SpotAngle = 50 ``` * Lua ```lua --the below script will make a slider set the Light's Spot Angle --[Add "slider" and "light" references to the Scripting Runtime component] light = Space.Host.GetReference("light").Light slider = Space.Host.GetReference("slider").UISlider light.Type = 2 --it has to be Spot type OVC = function() light.SpotAngle = (slider.Value * 178) + 1 --(from 1 to 179) end slider.OnValueChanged(OVC) ``` ##### Intensity[​](#intensity "Direct link to Intensity") float **Intensity** `get` `set` *Property Description* * Lua ```lua LightIntensity = Space.Host.ExecutingObject.Light.Intensity ``` * Lua ```lua --the below script will make a slider set the Light's Intensity --[Add "slider" and "light" references to the Scripting Runtime component] light = Space.Host.GetReference("light").Light slider = Space.Host.GetReference("slider").UISlider OVC = function() light.Intensity = (slider.Value * 8) --(from 0 to 8) end slider.OnValueChanged(OVC) ``` ##### Color[​](#color "Direct link to Color") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **Color** `get` `set` Get/Set the color of the light. * Lua ```lua Space.Host.ExecutingObject.Light.Color = Color.Red ``` * Lua ```lua --clicking the object will open a color picker that changes Light's color ----[Add "light" reference to the Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject light = Space.Host.GetReference("light").Light OnChange = function(SColor) light.Color = SColor end OnSelect = function(SColor) light.Color = SColor end OnCancel = function() end OnClick = function() Space.Dialogues.ColorPicker("Pick a color","Ok", OnChange, OnSelect, OnCancel, Color.Red) end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### Type[​](#type "Direct link to Type") int **Type** `get` `set` Get/Set the type of light this source is. 0 = Directional, 1 = Point, 2 = Spot, 3 = Area. * Lua ```lua Space.Host.ExecutingObject.Light.Type = 0 ``` * Lua ```lua --Clicking the object toggles between the 4 different light types --[Add "light" reference to the Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject light = Space.Host.GetReference("light").Light OnClick = function() if light.Type == 3 then light.Type = 0 else light.Type = light.Type + 1 end end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua ```lua theGameObject = Space.Host.ExecutingObject.Light.GameObject ``` --- ### SLineRenderer #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | --------------------------------------------------------------------------------------------------------------------------------------- | | void [**SetPosition** ](/scripting/client-scripting-api-reference/components/slinerenderer.md#setposition)(int index, SVector position) | | SVector [**GetPosition** ](/scripting/client-scripting-api-reference/components/slinerenderer.md#getposition)(int index) | | void [**SetPositions** ](/scripting/client-scripting-api-reference/components/slinerenderer.md#setpositions)(SVector\[] positions) | | SVector\[] [**GetPositions** ](/scripting/client-scripting-api-reference/components/slinerenderer.md#getpositions)() | | void [**SetWidth** ](/scripting/client-scripting-api-reference/components/slinerenderer.md#setwidth)(float start, float end) | | void [**SetColors** ](/scripting/client-scripting-api-reference/components/slinerenderer.md#setcolors)(SColor start, SColor end) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | -------------------------------------------------------------------------------------------------------------------------------- | | bool [**Enabled** ](/scripting/client-scripting-api-reference/components/slinerenderer.md#enabled)`get` `set` | | bool [**ReceiveShadows** ](/scripting/client-scripting-api-reference/components/slinerenderer.md#receiveshadows)`get` `set` | | bool [**IsVisible** ](/scripting/client-scripting-api-reference/components/slinerenderer.md#isvisible)`get` | | bool [**CastShadows** ](/scripting/client-scripting-api-reference/components/slinerenderer.md#castshadows)`get` `set` | | bool [**MotionVectors** ](/scripting/client-scripting-api-reference/components/slinerenderer.md#motionvectors)`get` `set` | | bool [**UseLightProbes** ](/scripting/client-scripting-api-reference/components/slinerenderer.md#uselightprobes)`get` `set` | | float [**StartWidth** ](/scripting/client-scripting-api-reference/components/slinerenderer.md#startwidth)`get` `set` | | float [**EndWidth** ](/scripting/client-scripting-api-reference/components/slinerenderer.md#endwidth)`get` `set` | | float [**WidthMultiplier** ](/scripting/client-scripting-api-reference/components/slinerenderer.md#widthmultiplier)`get` `set` | | SColor [**StartColor** ](/scripting/client-scripting-api-reference/components/slinerenderer.md#startcolor)`get` `set` | | SColor [**EndColor** ](/scripting/client-scripting-api-reference/components/slinerenderer.md#endcolor)`get` `set` | | int [**PositionCount** ](/scripting/client-scripting-api-reference/components/slinerenderer.md#positioncount)`get` `set` | | bool [**UseWorldSpace** ](/scripting/client-scripting-api-reference/components/slinerenderer.md#useworldspace)`get` `set` | | bool [**Loop** ](/scripting/client-scripting-api-reference/components/slinerenderer.md#loop)`get` `set` | | int [**NumCornerVertices** ](/scripting/client-scripting-api-reference/components/slinerenderer.md#numcornervertices)`get` `set` | | int [**NumCapVertices** ](/scripting/client-scripting-api-reference/components/slinerenderer.md#numcapvertices)`get` `set` | | int [**TextureMode** ](/scripting/client-scripting-api-reference/components/slinerenderer.md#texturemode)`get` `set` | | int [**Alignment** ](/scripting/client-scripting-api-reference/components/slinerenderer.md#alignment)`get` `set` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/slinerenderer.md#gameobject)`get` | #### Functions[​](#functions "Direct link to Functions") ##### SetPosition[​](#setposition "Direct link to SetPosition") void **SetPosition** (int index, [SVector](/scripting/client-scripting-api-reference/types/svector.md) position) *Set the position of a vertex in the line.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.LineRenderer.SetPosition(1,Vector.New(0,0,0)) ``` * Lua ```lua --this object will continuously render a line between two different game objects refObject1 = Space.Host.GetReference("object1") --Add in References section of Scripting Runtime Component refObject2 = Space.Host.GetReference("object2") --Add in References section of Scripting Runtime Component thisObject = Space.Host.ExecutingObject function OnUpdateFunction() thisObject.LineRenderer.PositionCount = 2 --this is necessary thisObject.LineRenderer.SetPosition(1,refObject1.WorldPosition) thisObject.LineRenderer.SetPosition(2,refObject2.WorldPosition) end thisObject.OnUpdate(OnUpdateFunction) ``` ##### GetPosition[​](#getposition "Direct link to GetPosition") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **GetPosition** (int index) *Get the position of a vertex in the line* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua vectorPosition = Space.Host.ExecutingObject.LineRenderer.GetPosition(1) ``` ##### SetPositions[​](#setpositions "Direct link to SetPositions") void **SetPositions** ([SVector](/scripting/client-scripting-api-reference/types/svector.md)\[] positions) *Set the positions of all vertices in the line.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.LineRenderer.SetPositions({Vector.New(0,0,0) , Vector.New(1,1,1)}) ``` * Lua ```lua --this object will continuously render a line between two different game objects refObject1 = Space.Host.GetReference("object1") --Add in References section of Scripting Runtime Component refObject2 = Space.Host.GetReference("object2") --Add in References section of Scripting Runtime Component thisObject = Space.Host.ExecutingObject function OnUpdateFunction() thisObject.LineRenderer.PositionCount = 2 --this is necessary thisObject.LineRenderer.SetPositions({refObject1.WorldPosition,refObject2.WorldPosition}) end thisObject.OnUpdate(OnUpdateFunction) ``` ##### GetPositions[​](#getpositions "Direct link to GetPositions") [SVector](/scripting/client-scripting-api-reference/types/svector.md)\[] **GetPositions** () *Get the positions of all vertices in the line.* * Lua ```lua tableVectorPositions = Space.Host.ExecutingObject.LineRenderer.GetPositions() ``` ##### SetWidth[​](#setwidth "Direct link to SetWidth") void **SetWidth** (float start, float end) *Set width at start and end* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.LineRenderer.SetWidth(5,7) ``` * Lua ```lua --the below script will make a slider set both the Line Renderer's Start Width and End Width thisGameObject = Space.Host.ExecutingObject refSlider = Space.Host.GetReference("Slider") --Add Reference to Scripting Runtime Component refLineRenderer = Space.Host.GetReference("LineRenderer") --Add Reference to Scripting Runtime Component OVC = function() local width = (refSlider.UISlider.Value * 5) -- from 0 to 5 refLineRenderer.LineRenderer.SetWidth(width,width) end refSlider.UISlider.OnValueChanged(OVC) ``` ##### SetColors[​](#setcolors "Direct link to SetColors") void **SetColors** ([SColor](/scripting/client-scripting-api-reference/types/scolor.md) start, [SColor](/scripting/client-scripting-api-reference/types/scolor.md) end) *Set color at start and end (Line shader necessary)* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.LineRenderer.SetColors(Color.Red, Color.Blue) ``` * Lua ```lua --clicking the object will open a color picker that changes both Line Renderer's Start Color and End Color thisGameObject = Space.Host.ExecutingObject originalStartColor = thisGameObject.LineRenderer.StartColor originalEndColor = thisGameObject.LineRenderer.EndColor OnChange = function(SColor) thisGameObject.LineRenderer.SetColors(SColor,SColor) end OnSelect = function(SColor) thisGameObject.LineRenderer.SetColors(SColor,SColor) end OnCancel = function() thisGameObject.LineRenderer.SetColors(originalStartColor,originalEndColor) end OnClick = function() Space.Dialogues.ColorPicker("title","okbutton", OnChange, OnSelect, OnCancel, originalStartColor) end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` #### Properties[​](#properties "Direct link to Properties") ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` *Makes the renderer visible if enabled.* * Lua ```lua Space.Host.ExecutingObject.LineRenderer.Enabled = false ``` * Lua ```lua --clicking this object toggles it's LineRenderer component On/Off thisObject = Space.Host.ExecutingObject function OnClickFunction() thisObject.LineRenderer.Enabled = not thisObject.LineRenderer.Enabled end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### ReceiveShadows[​](#receiveshadows "Direct link to ReceiveShadows") bool **ReceiveShadows** `get` `set` *Enable this option to make the line display any shadows that are cast upon it.* * Lua ```lua Space.Host.ExecutingObject.LineRenderer.ReceiveShadows = false ``` * Lua ```lua --clicking this object toggles it's Recieve Shadows options thisObject = Space.Host.ExecutingObject function OnClickFunction() thisObject.LineRenderer.ReceiveShadows = not thisObject.LineRenderer.ReceiveShadows end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### IsVisible[​](#isvisible "Direct link to IsVisible") bool **IsVisible** `get` *To check if this renderer is visible.* * Lua ```lua isVisible = Space.Host.ExecutingObject.LineRenderer.IsVisible ``` ##### CastShadows[​](#castshadows "Direct link to CastShadows") bool **CastShadows** `get` `set` *Specify if and how the line casts shadows when a suitable Light shine on it.* * Lua ```lua Space.Host.ExecutingObject.LineRenderer.CastShadows = true ``` ##### MotionVectors[​](#motionvectors "Direct link to MotionVectors") bool **MotionVectors** `get` `set` *Specifies whether this renderer has a per-object motion vector pass. If set to true, this object will have a per-object motion vector pass rendered* * Lua ```lua Space.Host.ExecutingObject.LineRenderer.MotionVectors = true ``` * Lua ```lua --clicking this object toggles it's Line Renderer's Motion Vectors (Per Object Motion or Force no motion) thisObject = Space.Host.ExecutingObject function OnClickFunction() thisObject.LineRenderer.MotionVectors = not thisObject.LineRenderer.MotionVectors end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### UseLightProbes[​](#uselightprobes "Direct link to UseLightProbes") bool **UseLightProbes** `get` `set` *The light probe interpolation type.* * Lua ```lua Space.Host.ExecutingObject.LineRenderer.UseLightProbes = true ``` * Lua ```lua --clicking this object toggles it's Light Probe between Off and Blend Mode thisObject = Space.Host.ExecutingObject function OnClickFunction() thisObject.LineRenderer.UseLightProbes = not thisObject.LineRenderer.UseLightProbes end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### StartWidth[​](#startwidth "Direct link to StartWidth") float **StartWidth** `get` `set` *Set the width at the start of the line.* * Lua ```lua Space.Host.ExecutingObject.LineRenderer.StartWidth = 1 ``` * Lua ```lua --the below script will make a slider change the Line Renderers start width thisGameObject = Space.Host.ExecutingObject refSlider = Space.Host.GetReference("Slider") --Add Reference to Scripting Runtime Component refLineRenderer = Space.Host.GetReference("LineRenderer") --Add Reference to Scripting Runtime Component refSlider.UISlider.Value = refLineRenderer.LineRenderer.StartWidth / 2 --initial position of slider OVC = function() refLineRenderer.LineRenderer.StartWidth = (refSlider.UISlider.Value * 2) -- from 0 to 2 end refSlider.UISlider.OnValueChanged(OVC) ``` ##### EndWidth[​](#endwidth "Direct link to EndWidth") float **EndWidth** `get` `set` *Set the width at the end of the line.* * Lua ```lua Space.Host.ExecutingObject.LineRenderer.EndWidth = 2 ``` * Lua ```lua --the below script will make a slider change the Line Renderer's End Width thisGameObject = Space.Host.ExecutingObject refSlider = Space.Host.GetReference("Slider") --Add Reference to Scripting Runtime Component refLineRenderer = Space.Host.GetReference("LineRenderer") --Add Reference to Scripting Runtime Component refSlider.UISlider.Value = refLineRenderer.LineRenderer.EndWidth / 2 --initial position of slider OVC = function() refLineRenderer.LineRenderer.EndWidth = (refSlider.UISlider.Value * 2) -- from 0 to 2 end refSlider.UISlider.OnValueChanged(OVC) ``` ##### WidthMultiplier[​](#widthmultiplier "Direct link to WidthMultiplier") float **WidthMultiplier** `get` `set` *Set an overall multiplier that is applied to the LineRenderer.widthCurve to get the final width of the line.* * Lua ```lua Space.Host.ExecutingObject.LineRenderer.WidthMultiplier = 1.2 ``` * Lua ```lua --the below script will make a slider change the Line Renderer's Width Multiplier thisGameObject = Space.Host.ExecutingObject refSlider = Space.Host.GetReference("Slider") --Add Reference to Scripting Runtime Component refLineRenderer = Space.Host.GetReference("LineRenderer") --Add Reference to Scripting Runtime Component refSlider.UISlider.Value = refLineRenderer.LineRenderer.WidthMultiplier / 5 --initial position of slider OVC = function() refLineRenderer.LineRenderer.WidthMultiplier = (refSlider.UISlider.Value * 5) -- from 0 to 5 end refSlider.UISlider.OnValueChanged(OVC) ``` ##### StartColor[​](#startcolor "Direct link to StartColor") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **StartColor** `get` `set` *Set the color at the start of the line.* * Lua ```lua Space.Host.ExecutingObject.LineRenderer.StartColor = Color.Red ``` * Lua ```lua --clicking the object will open a color picker that changes the Line Renderer's Start Color thisGameObject = Space.Host.ExecutingObject originalColor = thisGameObject.LineRenderer.StartColor OnChange = function(SColor) thisGameObject.LineRenderer.StartColor = SColor end OnSelect = function(SColor) thisGameObject.LineRenderer.StartColor = SColor end OnCancel = function() thisGameObject.LineRenderer.StartColor = originalColor end OnClick = function() Space.Dialogues.ColorPicker("title","okbutton", OnChange, OnSelect, OnCancel, originalColor) end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### EndColor[​](#endcolor "Direct link to EndColor") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **EndColor** `get` `set` *Set the color at the end of the line.* * Lua ```lua Space.Host.ExecutingObject.LineRenderer.EndColor = Color.Blue ``` * Lua ```lua --clicking the object will open a color picker that changes the Line Renderer's End Color thisGameObject = Space.Host.ExecutingObject originalColor = thisGameObject.LineRenderer.EndColor OnChange = function(SColor) thisGameObject.LineRenderer.EndColor = SColor end OnSelect = function(SColor) thisGameObject.LineRenderer.EndColor = SColor end OnCancel = function() thisGameObject.LineRenderer.EndColor = originalColor end OnClick = function() Space.Dialogues.ColorPicker("title","okbutton", OnChange, OnSelect, OnCancel, originalColor) end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### PositionCount[​](#positioncount "Direct link to PositionCount") int **PositionCount** `get` `set` *Set/get the number of vertices.* * Lua ```lua Space.Host.ExecutingObject.LineRenderer.PositionCount = 10 ``` * Lua ```lua --the below script will make a slider change the Line Renderer's Position Count thisGameObject = Space.Host.ExecutingObject refSlider = Space.Host.GetReference("Slider") --Add Reference to Scripting Runtime Component refLineRenderer = Space.Host.GetReference("LineRenderer") --Add Reference to Scripting Runtime Component refSlider.UISlider.Value = refLineRenderer.LineRenderer.PositionCount / 20 --initial position of slider OVC = function() refLineRenderer.LineRenderer.PositionCount = refSlider.UISlider.Value * 20 -- from 0 to 20 end refSlider.UISlider.OnValueChanged(OVC) ``` ##### UseWorldSpace[​](#useworldspace "Direct link to UseWorldSpace") bool **UseWorldSpace** `get` `set` *If enabled, the points are considered as world space coordinates. If disabled, they are local to the transform of the GameObject to which this component is attached.* * Lua ```lua Space.Host.ExecutingObject.LineRenderer.UseWorldSpace = true ``` * Lua ```lua --clicking this object toggles it's Use World Space option thisObject = Space.Host.ExecutingObject function OnClickFunction() thisObject.LineRenderer.UseWorldSpace = not thisObject.LineRenderer.UseWorldSpace end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### Loop[​](#loop "Direct link to Loop") bool **Loop** `get` `set` *Enable this to connect the first and last positions of the line, and form a closed loop.* * Lua ```lua Space.Host.ExecutingObject.LineRenderer.Loop = true ``` * Lua ```lua --clicking this object toggles it's Loop option thisObject = Space.Host.ExecutingObject function OnClickFunction() thisObject.LineRenderer.Loop = not thisObject.LineRenderer.Loop end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### NumCornerVertices[​](#numcornervertices "Direct link to NumCornerVertices") int **NumCornerVertices** `get` `set` *Set this to a value greater than 0, to get rounded corners between each segment of the line.* * Lua ```lua Space.Host.ExecutingObject.LineRenderer.NumCornerVertices = 2 ``` * Lua ```lua --the below script will make a slider change the Line Renderer's Corner Vertices thisGameObject = Space.Host.ExecutingObject refSlider = Space.Host.GetReference("Slider") --Add Reference to Scripting Runtime Component refLineRenderer = Space.Host.GetReference("LineRenderer") --Add Reference to Scripting Runtime Component refSlider.UISlider.Value = refLineRenderer.LineRenderer.NumCornerVertices / 10 --initial position of slider OVC = function() refLineRenderer.LineRenderer.NumCornerVertices = refSlider.UISlider.Value * 10 -- from 0 to 10 end refSlider.UISlider.OnValueChanged(OVC) ``` ##### NumCapVertices[​](#numcapvertices "Direct link to NumCapVertices") int **NumCapVertices** `get` `set` *Set this to a value greater than 0, to get rounded corners on each end of the line.* * Lua ```lua Space.Host.ExecutingObject.LineRenderer.NumCapVertices = 2 ``` * Lua ```lua --the below script will make a slider change the Line Renderer's End Cap Vertices thisGameObject = Space.Host.ExecutingObject refSlider = Space.Host.GetReference("Slider") --Add Reference to Scripting Runtime Component refLineRenderer = Space.Host.GetReference("LineRenderer") --Add Reference to Scripting Runtime Component refSlider.UISlider.Value = refLineRenderer.LineRenderer.NumCapVertices / 20 --initial position of slider OVC = function() refLineRenderer.LineRenderer.NumCapVertices = refSlider.UISlider.Value * 20 -- from 0 to 10 end refSlider.UISlider.OnValueChanged(OVC) ``` ##### TextureMode[​](#texturemode "Direct link to TextureMode") int **TextureMode** `get` `set` *Control how the Texture is applied to the line. (0-3)* * Lua ```lua Space.Host.ExecutingObject.LineRenderer.TextureMode = 2 ``` * Lua ```lua --clicking this object toggles between it's 4 Texture Modes thisObject = Space.Host.ExecutingObject function OnClickFunction() if thisObject.LineRenderer.TextureMode == 3 then thisObject.LineRenderer.TextureMode = 0 else thisObject.LineRenderer.TextureMode = thisObject.LineRenderer.TextureMode + 1 end end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### Alignment[​](#alignment "Direct link to Alignment") int **Alignment** `get` `set` *Set the direction that the line faces. (0 or 1)* * Lua ```lua Space.Host.ExecutingObject.LineRenderer.Alignment = 1 ``` * Lua ```lua --clicking this object toggles it's Alignment option between View (0) and Transform Z (1) thisObject = Space.Host.ExecutingObject function OnClickFunction() if thisObject.LineRenderer.Alignment == 0 then thisObject.LineRenderer.Alignment = 1 else thisObject.LineRenderer.Alignment = 0 end end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua ```lua theGameObject = Space.Host.ExecutingObject.LineRenderer.GameObject ``` --- ### SMeshRenderer #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ------------------------------------------------------------------------------------------------------------------------------------- | | bool [**IsVisible** ](/scripting/client-scripting-api-reference/components/smeshrenderer.md#isvisible)`get` | | bool [**Enabled** ](/scripting/client-scripting-api-reference/components/smeshrenderer.md#enabled)`get` `set` | | SMaterial [**Material** ](/scripting/client-scripting-api-reference/components/smeshrenderer.md#material)`get` `set` | | SMaterial [**SharedMaterial** ](/scripting/client-scripting-api-reference/components/smeshrenderer.md#sharedmaterial)`get` `set` | | SMaterial\[] [**Materials** ](/scripting/client-scripting-api-reference/components/smeshrenderer.md#materials)`get` `set` | | SMaterial\[] [**SharedMaterials** ](/scripting/client-scripting-api-reference/components/smeshrenderer.md#sharedmaterials)`get` `set` | | SVector [**BoundsMax** ](/scripting/client-scripting-api-reference/components/smeshrenderer.md#boundsmax)`get` | | SVector [**BoundsMin** ](/scripting/client-scripting-api-reference/components/smeshrenderer.md#boundsmin)`get` | #### Properties[​](#properties "Direct link to Properties") ##### IsVisible[​](#isvisible "Direct link to IsVisible") bool **IsVisible** `get` *Returns true if the renderer is visible on any camera. Note that the object is considered visible when it needs to be rendered in the Scene. For example, it might not actually be visible by any camera but still need to be rendered for shadows. When running in the editor, the Scene view cameras will also cause this value to be true.* * Lua ```lua isVisible = Space.Host.ExecutingObject.MeshRenderer.IsVisible ``` * Lua ```lua --this object will move forward only if visible on a camera thisObject = Space.Host.ExecutingObject function OnUpdateFunction() if thisObject.MeshRenderer.IsVisible then thisObject.WorldPosition = thisObject.WorldPosition + (thisObject.Forward * Space.DeltaTime * 0.2) end end thisObject.OnUpdate(OnUpdateFunction) ``` ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` *Makes the rendered 3D object visible if enabled.* * Lua ```lua Space.Host.ExecutingObject.MeshRenderer.Enabled = false ``` * Lua ```lua --clicking this object will Enable/Disable it's Mesh Renderer component thisGameObject = Space.Host.ExecutingObject component = thisGameObject.MeshRenderer OnClick = function() component.Enabled = not component.Enabled end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### Material[​](#material "Direct link to Material") [SMaterial](/scripting/client-scripting-api-reference/types/smaterial.md) **Material** `get` `set` *Returns the first instantiated Material assigned to the renderer.* *Modifying material will change the material for this object only.* *If the material is used by any other renderers, this will clone the shared material and start using it from now on.* * Lua ```lua Space.Host.ExecutingObject.MeshRenderer.Material.SetColor("_Color", 1.0, 0.5, 0.5, 1.0) ``` * Lua ```lua --clicking this object will toggle it's material's color between Red and Black color when clicked thisObject = Space.Host.ExecutingObject function OnClickFunction() if thisObject.MeshRenderer.Material.GetColor("_Color") == Color.Black then thisObject.MeshRenderer.Material.SetColor("_Color", Color.Red) else thisObject.MeshRenderer.Material.SetColor("_Color", Color.Black) end end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### SharedMaterial[​](#sharedmaterial "Direct link to SharedMaterial") [SMaterial](/scripting/client-scripting-api-reference/types/smaterial.md) **SharedMaterial** `get` `set` *The shared material of this object.* *Modifying sharedMaterial will change the appearance of all objects using this material, and change material settings that are stored in the project too.* *It is not recommended to modify materials returned by sharedMaterial. If you want to modify the material of a renderer use material instead.* * Lua ```lua Space.Host.ExecutingObject.MeshRenderer.SharedMaterial.SetColor("_Color", 1.0, 0.5, 0.5, 1.0) ``` * Lua ```lua --clicking this object will toggle it's shared material's color between Red and Black color when clicked thisObject = Space.Host.ExecutingObject function OnClickFunction() if thisObject.MeshRenderer.SharedMaterial.GetColor("_Color") == Color.Black then thisObject.MeshRenderer.SharedMaterial.SetColor("_Color", Color.Red) else thisObject.MeshRenderer.SharedMaterial.SetColor("_Color", Color.Black) end end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### Materials[​](#materials "Direct link to Materials") [SMaterial](/scripting/client-scripting-api-reference/types/smaterial.md)\[] **Materials** `get` `set` *Returns all the instantiated materials of this object.* *This is an array of all materials used by the renderer. Unity supports a single object using multiple materials; in this case materials contains all the materials. sharedMaterial and material properties return the first used material if there is more than one.* *Modifying any material in materials will change the appearance of only that object.* *Note that like all arrays returned by Unity, this returns a copy of materials array. If you want to change some materials in it, get the value, change an entry and set materials back.* * Lua ```lua mats = Space.Host.ExecutingObject.MeshRenderer.Materials ``` ##### SharedMaterials[​](#sharedmaterials "Direct link to SharedMaterials") [SMaterial](/scripting/client-scripting-api-reference/types/smaterial.md)\[] **SharedMaterials** `get` `set` *The shared material of this object.* *Modifying sharedMaterial will change the appearance of all objects using this material, and change material settings that are stored in the project too.* *It is not recommended to modify materials returned by sharedMaterial. If you want to modify the material of a renderer use material instead.* * Lua ```lua Space.Host.ExecutingObject.MeshRenderer.SharedMaterial.SetColor("_Color", 1.0, 0.5, 0.5, 1.0) ``` * Lua ```lua --clicking this object will toggle it's shared material's color between Red and Black color when clicked thisObject = Space.Host.ExecutingObject function OnClickFunction() if thisObject.MeshRenderer.SharedMaterial.GetColor("_Color") == Color.Black then thisObject.MeshRenderer.SharedMaterial.SetColor("_Color", Color.Red) else thisObject.MeshRenderer.SharedMaterial.SetColor("_Color", Color.Black) end end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### BoundsMax[​](#boundsmax "Direct link to BoundsMax") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **BoundsMax** `get` *Property Description* * Lua ```lua Space.Host.ExecutingObject.MeshRenderer.BoundsMax = Vector.New(1,1,1) ``` ##### BoundsMin[​](#boundsmin "Direct link to BoundsMin") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **BoundsMin** `get` *Property Description* * Lua ```lua Space.Host.ExecutingObject.MeshRenderer.BoundsMin = Vector.New(0,0,0) ``` --- ### SModularVehicle #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | --------------------------------------------------------------------------------------------------------------------------------------------- | | void [**ForceSetOwner** ](/scripting/client-scripting-api-reference/components/smodularvehicle.md#forcesetowner)(int newOwner, int vehicleId) | | void [**ForceActivate** ](/scripting/client-scripting-api-reference/components/smodularvehicle.md#forceactivate)() | | void [**ForceDeactivate** ](/scripting/client-scripting-api-reference/components/smodularvehicle.md#forcedeactivate)() | | void [**SuppressTimeout** ](/scripting/client-scripting-api-reference/components/smodularvehicle.md#suppresstimeout)() | | void [**OverrideOnClick** ](/scripting/client-scripting-api-reference/components/smodularvehicle.md#overrideonclick)(Closure onClick) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | -------------------------------------------------------------------------------------------------------------------------------- | | float [**VerticalInput** ](/scripting/client-scripting-api-reference/components/smodularvehicle.md#verticalinput)`get` `set` | | float [**HorizontalInput** ](/scripting/client-scripting-api-reference/components/smodularvehicle.md#horizontalinput)`get` `set` | | float [**StrafeInput** ](/scripting/client-scripting-api-reference/components/smodularvehicle.md#strafeinput)`get` `set` | | float [**DepthInput** ](/scripting/client-scripting-api-reference/components/smodularvehicle.md#depthinput)`get` `set` | | bool [**IgnoreUserInput** ](/scripting/client-scripting-api-reference/components/smodularvehicle.md#ignoreuserinput)`get` `set` | | SAvatar [**Driver** ](/scripting/client-scripting-api-reference/components/smodularvehicle.md#driver)`get` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/smodularvehicle.md#gameobject)`get` | #### Functions[​](#functions "Direct link to Functions") ##### ForceSetOwner[​](#forcesetowner "Direct link to ForceSetOwner") void **ForceSetOwner** (int newOwner, int vehicleId) *Force player of the id owned this vehicle, but only between this spawned vehicle. But it seems the new owner can’t drive on this vehicle.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | | | | | * Lua ```lua Space.Host.ExecutingObject.Vehicle.ForceSetOwner(AvatarID) ``` ##### ForceActivate[​](#forceactivate "Direct link to ForceActivate") void **ForceActivate** () *Force player drive on this vehicle* * Lua ```lua Space.Host.ExecutingObject.Vehicle.ForceActivate() ``` ##### ForceDeactivate[​](#forcedeactivate "Direct link to ForceDeactivate") void **ForceDeactivate** () *Force player out of the vehicle*. * Lua ```lua Space.Host.ExecutingObject.Vehicle.ForceDeactivate() ``` ##### SuppressTimeout[​](#suppresstimeout "Direct link to SuppressTimeout") void **SuppressTimeout** () *Disable the vehicle automatic respawn* * Lua ```lua Space.Host.ExecutingObject.Vehicle.SuppressTimeout() ``` ##### OverrideOnClick[​](#overrideonclick "Direct link to OverrideOnClick") void **OverrideOnClick** (Closure onClick) *Add onClick method to this vehicle,onClick have to be a closure.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Vehicle.OverrideOnClick(NewOnClickFunction) ``` #### Properties[​](#properties "Direct link to Properties") ##### VerticalInput[​](#verticalinput "Direct link to VerticalInput") float **VerticalInput** `get` `set` *Force vertical offset value, it would be added to vertical control and never set to zero.* * Lua ```lua Space.Host.ExecutingObject.Vehicle.VerticalInput = 0.5 ``` ##### HorizontalInput[​](#horizontalinput "Direct link to HorizontalInput") float **HorizontalInput** `get` `set` *Force horizontal offset value, it would be added to horizontal control and never set to zero.* * Lua ```lua Space.Host.ExecutingObject.Vehicle.HorizontalInput = 0.5 ``` ##### StrafeInput[​](#strafeinput "Direct link to StrafeInput") float **StrafeInput** `get` `set` *Force strafe offset value,it would be added to strafe control and never set to zero.* * Lua ```lua Space.Host.ExecutingObject.Vehicle.StrafeInput = 0.5 ``` ##### DepthInput[​](#depthinput "Direct link to DepthInput") float **DepthInput** `get` `set` *Force depth offset value, it would be added to depth control and never set to zero.* * Lua ```lua Space.Host.ExecutingObject.Vehicle.DepthInput = 0.5 ``` ##### IgnoreUserInput[​](#ignoreuserinput "Direct link to IgnoreUserInput") bool **IgnoreUserInput** `get` `set` *If this option is enabled, user input would be ignored until disable this.* * Lua ```lua Space.Host.ExecutingObject.Vehicle.IgnoreUserInput = true ``` ##### Driver[​](#driver "Direct link to Driver") [SAvatar](/scripting/client-scripting-api-reference/types/savatar.md) **Driver** `get` *Get the player avatar component.* * Lua ```lua DriverAvatar = Space.Host.ExecutingObject.Vehicle.Driver ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Returns the GameObject of this Vehicle component.* * Lua ```lua VehicleGameObject = Space.Host.ExecutingObject.Vehicle.GameObject ``` --- ### SNavMeshAgent #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | ------------------------------------------------------------------------------------------------------------------------------------- | | float [**GetAreaCost** ](/scripting/client-scripting-api-reference/components/snavmeshagent.md#getareacost)(int areaIndex) | | void [**Move** ](/scripting/client-scripting-api-reference/components/snavmeshagent.md#move)(SVector movement) | | void [**Resume** ](/scripting/client-scripting-api-reference/components/snavmeshagent.md#resume)() | | void [**SetAreaCost** ](/scripting/client-scripting-api-reference/components/snavmeshagent.md#setareacost)(int areaIndex, float cost) | | void [**Stop** ](/scripting/client-scripting-api-reference/components/snavmeshagent.md#stop)() | | void [**SetDestination** ](/scripting/client-scripting-api-reference/components/snavmeshagent.md#setdestination)(SVector position) | | void [**Warp** ](/scripting/client-scripting-api-reference/components/snavmeshagent.md#wrap)(SVector position) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | --------------------------------------------------------------------------------------------------------------------------------------------- | | bool [**Enabled** ](/scripting/client-scripting-api-reference/components/snavmeshagent.md#enabled)`get` `set` | | float [**Accelleration** ](/scripting/client-scripting-api-reference/components/snavmeshagent.md#accelleration)`get` `set` | | float [**AngularSpeed** ](/scripting/client-scripting-api-reference/components/snavmeshagent.md#angularspeed)`get` `set` | | int [**AreaMask** ](/scripting/client-scripting-api-reference/components/snavmeshagent.md#areamask)`get` `set` | | bool [**AutoRepath** ](/scripting/client-scripting-api-reference/components/snavmeshagent.md#autorepath)`get` `set` | | bool [**AutoBraking** ](/scripting/client-scripting-api-reference/components/snavmeshagent.md#autobraking)`get` `set` | | bool [**AutoTraverseOffMeshLink** ](/scripting/client-scripting-api-reference/components/snavmeshagent.md#autotraverseoffmeshlink)`get` `set` | | int [**AvoidancePriority** ](/scripting/client-scripting-api-reference/components/snavmeshagent.md#avoidancepriority)`get` `set` | | float [**BaseOffset** ](/scripting/client-scripting-api-reference/components/snavmeshagent.md#baseoffset)`get` `set` | | SVector [**DesiredVelocity** ](/scripting/client-scripting-api-reference/components/snavmeshagent.md#desiredvelocity)`get` | | SVector [**Destination** ](/scripting/client-scripting-api-reference/components/snavmeshagent.md#destination)`get` `set` | | bool [**HasPath** ](/scripting/client-scripting-api-reference/components/snavmeshagent.md#haspath)`get` | | float [**Height** ](/scripting/client-scripting-api-reference/components/snavmeshagent.md#height)`get` `set` | | bool [**IsOnNavMesh** ](/scripting/client-scripting-api-reference/components/snavmeshagent.md#isonnavmesh)`get` | | bool [**IsOnOffMeshLink** ](/scripting/client-scripting-api-reference/components/snavmeshagent.md#isonoffmeshlink)`get` | | bool [**IsPathStale** ](/scripting/client-scripting-api-reference/components/snavmeshagent.md#ispathstale)`get` | | SVector [**NextPosition** ](/scripting/client-scripting-api-reference/components/snavmeshagent.md#nextposition)`get` `set` | | SVector [**PathEndPosition** ](/scripting/client-scripting-api-reference/components/snavmeshagent.md#pathendposition)`get` | | bool [**PathPending** ](/scripting/client-scripting-api-reference/components/snavmeshagent.md#pathpending)`get` | | float [**Radius** ](/scripting/client-scripting-api-reference/components/snavmeshagent.md#radius)`get` `set` | | float [**RemainingDistance** ](/scripting/client-scripting-api-reference/components/snavmeshagent.md#remainingdistance)`get` | | float [**Speed** ](/scripting/client-scripting-api-reference/components/snavmeshagent.md#speed)`get` `set` | | SVector [**SteeringTarget** ](/scripting/client-scripting-api-reference/components/snavmeshagent.md#steeringtarget)`get` | | float [**StoppingDistance** ](/scripting/client-scripting-api-reference/components/snavmeshagent.md#stoppingdistance)`get` `set` | | bool [**UpdatePosition** ](/scripting/client-scripting-api-reference/components/snavmeshagent.md#updateposition)`get` `set` | | bool [**UpdateRotation** ](/scripting/client-scripting-api-reference/components/snavmeshagent.md#updaterotation)`get` `set` | | SVector [**Velocity** ](/scripting/client-scripting-api-reference/components/snavmeshagent.md#velocity)`get` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/snavmeshagent.md#gameobject)`get` | #### Functions[​](#functions "Direct link to Functions") ##### GetAreaCost[​](#getareacost "Direct link to GetAreaCost") float **GetAreaCost** (int areaIndex) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua floatCost = Space.Host.ExecutingObject.NavMeshAgent.GetAreaCost(1) ``` ##### Move[​](#move "Direct link to Move") void **Move** ([SVector](/scripting/client-scripting-api-reference/types/svector.md) movement) *Apply relative movement to current position.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.NavMeshAgent.Move(Vector.New(2,0,0)) ``` ##### Resume[​](#resume "Direct link to Resume") void **Resume** () *Resume the NavMesh agent.* * Lua ```lua Space.Host.ExecutingObject.NavMeshAgent.Resume() ``` * Lua ```lua agentobject = Space.Scene.Find("Cube") agent = agentobject.NavMeshAgent if agent == nil then agent = Space.Scene.Find("Cube").AddNavMeshAgent() end counts = 0 --stop first, then resume. function StopAndResume() counts = counts +1 if counts > 10 then agent.Stop() end if counts > 50 then agent.Resume() end end agentobject.SubscribeToEvents() agentobject.OnUpdate(StopAndResume) agent.Destination = Space.Scene.Find("TargetTransform").WorldPosition --set destination. ``` ##### SetAreaCost[​](#setareacost "Direct link to SetAreaCost") void **SetAreaCost** (int areaIndex, float cost) *Sets the cost for traversing over areas of the area type.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.NavMeshAgent.SetAreaCost(1, 10.0) ``` ##### Stop[​](#stop "Direct link to Stop") void **Stop** () *To stop the NavMesh agent.* * Lua ```lua Space.Host.ExecutingObject.NavMeshAgent.Stop() ``` ##### SetDestination[​](#setdestination "Direct link to SetDestination") void **SetDestination** ([SVector](/scripting/client-scripting-api-reference/types/svector.md) position) *Set or update the destination.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.NavMeshAgent.SetDestination(Vector.New(10,0,0)) ``` ##### Warp[​](#warp "Direct link to Warp") void **Warp** ([SVector](/scripting/client-scripting-api-reference/types/svector.md) position) *Warp to the position you want, also you can set agent's world position and vector to make this act as Move(SVector position).* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.NavMeshAgent.Warp(Vector.New(10,0,0)) ``` #### Properties[​](#properties "Direct link to Properties") ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` *Enable or disable this component.* * Lua ```lua Space.Host.ExecutingObject.NavMeshAgent.Enabled = false ``` * Lua ```lua --clicking this object will Enable/Disable it's Nav Mesh Agent component thisGameObject = Space.Host.ExecutingObject component = thisGameObject.NavMeshAgent OnClick = function() component.Enabled = not component.Enabled end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### Accelleration[​](#accelleration "Direct link to Accelleration") float **Accelleration** `get` `set` *The maximum acceleration of an agent as it follows a path.* * Lua ```lua Space.Host.ExecutingObject.NavMeshAgent.Accelleration = 60 ``` ##### AngularSpeed[​](#angularspeed "Direct link to AngularSpeed") float **AngularSpeed** `get` `set` *Maximum turning speed in while following a path.* * Lua ```lua Space.Host.ExecutingObject.NavMeshAgent.AngularSpeed = 60 ``` ##### AreaMask[​](#areamask "Direct link to AreaMask") int **AreaMask** `get` `set` *Specifies which NavMesh area is passable.* * Lua ```lua Space.Host.ExecutingObject.NavMeshAgent.AreaMask = 3 ``` ##### AutoRepath[​](#autorepath "Direct link to AutoRepath") bool **AutoRepath** `get` `set` *Set the agent attempt to acquire a new path if the existing path becomes invalid.* * Lua ```lua Space.Host.ExecutingObject.NavMeshAgent.AutoRepath = false ``` ##### AutoBraking[​](#autobraking "Direct link to AutoBraking") bool **AutoBraking** `get` `set` *Set the agent brake automatically to avoid overshooting the destination point.* * Lua ```lua Space.Host.ExecutingObject.NavMeshAgent.AutoBraking = false ``` ##### AutoTraverseOffMeshLink[​](#autotraverseoffmeshlink "Direct link to AutoTraverseOffMeshLink") bool **AutoTraverseOffMeshLink** `get` `set` *Set the agent move across OffMeshLinks automatically.* * Lua ```lua Space.Host.ExecutingObject.NavMeshAgent.AutoTraverseOffMeshLink = false ``` ##### AvoidancePriority[​](#avoidancepriority "Direct link to AvoidancePriority") int **AvoidancePriority** `get` `set` *The avoidance priority level.* * Lua ```lua Space.Host.ExecutingObject.NavMeshAgent.AvoidancePriority = 10 ``` ##### BaseOffset[​](#baseoffset "Direct link to BaseOffset") float **BaseOffset** `get` `set` *The relative vertical displacement of the GameObject.* * Lua ```lua Space.Host.ExecutingObject.NavMeshAgent.BaseOffset = 3 ``` ##### DesiredVelocity[​](#desiredvelocity "Direct link to DesiredVelocity") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **DesiredVelocity** `get` *The desired velocity of the agent including any potential contribution from avoidance.* * Lua ```lua vectorVelocity = Space.Host.ExecutingObject.NavMeshAgent.DesiredVelocity ``` ##### Destination[​](#destination "Direct link to Destination") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **Destination** `get` `set` *The desired velocity of the agent including any potential contribution from avoidance.* * Lua ```lua Space.Host.ExecutingObject.NavMeshAgent.Destination = Vector.New(10,0,0) ``` ##### HasPath[​](#haspath "Direct link to HasPath") bool **HasPath** `get` *Does the agent currently have a path?* * Lua ```lua hasPath = Space.Host.ExecutingObject.NavMeshAgent.HasPath ``` ##### Height[​](#height "Direct link to Height") float **Height** `get` `set` *The height of the agent for purposes of passing under obstacles, etc.* * Lua ```lua Space.Host.ExecutingObject.NavMeshAgent.Height = 5 ``` ##### IsOnNavMesh[​](#isonnavmesh "Direct link to IsOnNavMesh") bool **IsOnNavMesh** `get` *Is the agent currently bound to the navmesh?* * Lua ```lua isOn = Space.Host.ExecutingObject.NavMeshAgent.IsOnNavMesh ``` ##### IsOnOffMeshLink[​](#isonoffmeshlink "Direct link to IsOnOffMeshLink") bool **IsOnOffMeshLink** `get` *Is the agent currently positioned on an OffMeshLink?* * Lua ```lua isOnOff = Space.Host.ExecutingObject.NavMeshAgent.IsOnOffMeshLink ``` ##### IsPathStale[​](#ispathstale "Direct link to IsPathStale") bool **IsPathStale** `get` *Is the current path stale?* * Lua ```lua isStale = Space.Host.ExecutingObject.NavMeshAgent.IsPathStale ``` ##### NextPosition[​](#nextposition "Direct link to NextPosition") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **NextPosition** `get` `set` *Get or set the simulation position of the navmesh agent.* * Lua ```lua Space.Host.ExecutingObject.NavMeshAgent.NextPosition = Vector.New(10, 0, 0) ``` ##### PathEndPosition[​](#pathendposition "Direct link to PathEndPosition") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **PathEndPosition** `get` *End positon of navigation.* * Lua ```lua vectorPathEndPos = Space.Host.ExecutingObject.NavMeshAgent.PathEndPosition ``` ##### PathPending[​](#pathpending "Direct link to PathPending") bool **PathPending** `get` *Is a path in the process of being computed but not yet ready?* * Lua ```lua isPending = Space.Host.ExecutingObject.NavMeshAgent.PathPending ``` ##### Radius[​](#radius "Direct link to Radius") float **Radius** `get` `set` *The avoidance radius for the agent.* * Lua ```lua Space.Host.ExecutingObject.NavMeshAgent.Radius = 5 ``` ##### RemainingDistance[​](#remainingdistance "Direct link to RemainingDistance") float **RemainingDistance** `get` *The distance between the agent's position and the destination on the current path.* * Lua ```lua vectorDist = Space.Host.ExecutingObject.NavMeshAgent.RemainingDistance ``` ##### Speed[​](#speed "Direct link to Speed") float **Speed** `get` `set` *Maximum movement speed when following a path.* * Lua ```lua Space.Host.ExecutingObject.NavMeshAgent.Speed = 20 ``` ##### SteeringTarget[​](#steeringtarget "Direct link to SteeringTarget") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **SteeringTarget** `get` *Get the current steering target along the path.* * Lua ```lua vectorSteeringTarget = Space.Host.ExecutingObject.NavMeshAgent.SteeringTarget ``` ##### StoppingDistance[​](#stoppingdistance "Direct link to StoppingDistance") float **StoppingDistance** `get` `set` *Stop within this distance from the target position.* * Lua ```lua Space.Host.ExecutingObject.NavMeshAgent.StoppingDistance = 2 ``` ##### UpdatePosition[​](#updateposition "Direct link to UpdatePosition") bool **UpdatePosition** `get` `set` *Get or set whether the transform position is synchronized with the simulated agent position.* * Lua ```lua Space.Host.ExecutingObject.NavMeshAgent.UpdatePosition = true ``` ##### UpdateRotation[​](#updaterotation "Direct link to UpdateRotation") bool **UpdateRotation** `get` `set` *Should the agent update the transform orientation?* * Lua ```lua Space.Host.ExecutingObject.NavMeshAgent.UpdateRotation = true ``` ##### Velocity[​](#velocity "Direct link to Velocity") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **Velocity** `get` *access the current velocity of the NavMeshAgent component, or set a velocity to control the agent manually.* * Lua ```lua vectorVelocity = Space.Host.ExecutingObject.NavMeshAgent.Velocity ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua ```lua theGameObject = Space.Host.ExecutingObject.NavMeshAgent.GameObject ``` --- ### SNavMeshObstacle #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ---------------------------------------------------------------------------------------------------------------------------------------- | | bool [**CarveOnlyStationary** ](/scripting/client-scripting-api-reference/components/snavmeshobstacle.md#carveonlystationary)`get` `set` | | bool [**Carving** ](/scripting/client-scripting-api-reference/components/snavmeshobstacle.md#carving)`get` `set` | | SVector [**Center** ](/scripting/client-scripting-api-reference/components/snavmeshobstacle.md#center)`get` `set` | | float [**Height** ](/scripting/client-scripting-api-reference/components/snavmeshobstacle.md#height)`get` `set` | | SVector [**Size** ](/scripting/client-scripting-api-reference/components/snavmeshobstacle.md#size)`get` `set` | | float [**Radius** ](/scripting/client-scripting-api-reference/components/snavmeshobstacle.md#radius)`get` `set` | | int [**Shape** ](/scripting/client-scripting-api-reference/components/snavmeshobstacle.md#shape)`get` `set` | | float [**MoveThreshold** ](/scripting/client-scripting-api-reference/components/snavmeshobstacle.md#movethreshold)`get` `set` | | float [**TimeToStationary** ](/scripting/client-scripting-api-reference/components/snavmeshobstacle.md#timetostationary)`get` `set` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/snavmeshobstacle.md#gameobject)`get` | #### Properties[​](#properties "Direct link to Properties") ##### CarveOnlyStationary[​](#carveonlystationary "Direct link to CarveOnlyStationary") bool **CarveOnlyStationary** `get` `set` *When enabled, the obstacle is carved only when it is stationary. (Only can enabled after carve was ticked).* * Lua ```lua Space.Host.ExecutingObject.NavMeshObstacle.CarveOnlyStationary = true ``` ##### Carving[​](#carving "Direct link to Carving") bool **Carving** `get` `set` *When the Carve checkbox gets ticked, the Nav Mesh Obstacle creates a hole in the NavMesh.* * Lua ```lua Space.Host.ExecutingObject.NavMeshObstacle.Carving = true ``` ##### Center[​](#center "Direct link to Center") SVector **Center** `get` `set` *Center of the obstacle geometry relative to the transform position.* * Lua ```lua Space.Host.ExecutingObject.NavMeshObstacle.Center = Vector.New(0,0,0) ``` ##### Height[​](#height "Direct link to Height") float **Height** `get` `set` *Height of the capsule. (Property of Capsule shape).* * Lua ```lua Space.Host.ExecutingObject.NavMeshObstacle.Height = 40 ``` ##### Size[​](#size "Direct link to Size") SVector **Size** `get` `set` *Size of the box. (Property of Box shape).* * Lua ```lua Space.Host.ExecutingObject.NavMeshObstacle.Size = Vector.New(5,10,15) ``` ##### Radius[​](#radius "Direct link to Radius") float **Radius** `get` `set` *Property Description* * Lua ```lua Space.Host.ExecutingObject.NavMeshObstacle.Radius = 10 ``` ##### Shape[​](#shape "Direct link to Shape") int **Shape** `get` `set` *Property Description* * Lua ```lua Space.Host.ExecutingObject.NavMeshObstacle.Shape = 1 ``` ##### MoveThreshold[​](#movethreshold "Direct link to MoveThreshold") float **MoveThreshold** `get` `set` *Use this property to set the threshold distance for updating a moving carved hole. (Only can take effect after carve was ticked)* * Lua ```lua Space.Host.ExecutingObject.NavMeshObstacle.MoveThreshold = 5 ``` ##### TimeToStationary[​](#timetostationary "Direct link to TimeToStationary") float **TimeToStationary** `get` `set` *The time to wait until the obstacle is treated as stationary. (Only can take effect after carve was ticked).* * Lua ```lua Space.Host.ExecutingObject.NavMeshObstacle.TimeToStationary = 5.0 ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua ```lua theGameObject = Space.Host.ExecutingObject.NavMeshObstacle.GameObject ``` --- ### SNetworking #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | ---------------------------------------------------------------------------------------------------------------------------- | | void [**SendEvent** ](/scripting/client-scripting-api-reference/components/snetworking.md#sendevent)(string eventName) | | void [**ReceiveEvent** ](/scripting/client-scripting-api-reference/components/snetworking.md#receiveevent)(string eventName) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | --------------------------------------------------------------------------------------------------------------------- | | bool [**Enabled** ](/scripting/client-scripting-api-reference/components/snetworking.md#enabled)`get` `set` | | bool [**Instanced** ](/scripting/client-scripting-api-reference/components/snetworking.md#instanced)`get` | | string [**NetworkName** ](/scripting/client-scripting-api-reference/components/snetworking.md#networkname)`get` `set` | | bool [**Ready** ](/scripting/client-scripting-api-reference/components/snetworking.md#ready)`get` | | int [**EventCount** ](/scripting/client-scripting-api-reference/components/snetworking.md#eventcount)`get` | | string\[] [**EventNames** ](/scripting/client-scripting-api-reference/components/snetworking.md#eventnames)`get` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/snetworking.md#gameobject)`get` | #### Functions[​](#functions "Direct link to Functions") ##### SendEvent[​](#sendevent "Direct link to SendEvent") void **SendEvent** (string eventName) *Send a networking event event that will be received by other components in the scene with the same network name.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Networking.SendEvent("Light On") ``` ##### ReceiveEvent[​](#receiveevent "Direct link to ReceiveEvent") void **ReceiveEvent** (string eventName) *Invoke an event on the networking component. Normally not necessary to do manually, as this happens automatically when receiving a matching event over the network, but may be useful to initialize a state.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Networking.ReceiveEvent("Light On") ``` #### Properties[​](#properties "Direct link to Properties") ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` *Whether the simple networking component is Enabled or not* * Lua ```lua Space.Host.ExecutingObject.Networking.Enabled = true ``` ##### Instanced[​](#instanced "Direct link to Instanced") bool **Instanced** `get` *Returns whether this networking component is instanced or not.* * Lua ```lua isInstanced = Space.Host.ExecutingObject.Networking.Instanced ``` ##### NetworkName[​](#networkname "Direct link to NetworkName") string **NetworkName** `get` `set` *Returns or sets the name of the network. Network name must be at least 20 characters long without trailing or leading spaces.* * Lua ```lua Space.Host.ExecutingObject.Networking.NetworkName = "Example Network Name 1" ``` ##### Ready[​](#ready "Direct link to Ready") bool **Ready** `get` *Return whether the networking component is ready to send or not (is initialized).* * Lua ```lua isReady = Space.Host.ExecutingObject.Networking.Ready ``` ##### EventCount[​](#eventcount "Direct link to EventCount") int **EventCount** `get` *Return the number of events this component is waiting to receive.* * Lua ```lua count = Space.Host.ExecutingObject.Networking.EventCount ``` ##### EventNames[​](#eventnames "Direct link to EventNames") string\[] **EventNames** `get` *Return a list of names of events that this component will receive.* * Lua ```lua tableOfNames = Space.Host.ExecutingObject.Networking.EventNames ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua ```lua theGameObject = Space.Host.ExecutingObject.Networking.GameObject ``` --- ### SParticleSystem #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | void [**Play** ](sparticlesystem#play)(bool withChildren)
void [**Play** ](sparticlesystem#play)() | | void [**Stop** ](sparticlesystem#stop)(bool withChildren)
void [**Stop** ](sparticlesystem#stop)() | | void [**Pause** ](sparticlesystem#pause)(bool withChildren)
void [**Pause** ](sparticlesystem#pause)() | | void [**Clear** ](sparticlesystem#clear)(bool withChildren)
void [**Clear** ](sparticlesystem#clear)() | | bool [**IsAlive** ](/scripting/client-scripting-api-reference/components/sparticlesystem.md#isalive)(bool withChildren) | | void [**Emit** ](/scripting/client-scripting-api-reference/components/sparticlesystem.md#emit)(int count) | | void [**Simulate** ](/scripting/client-scripting-api-reference/components/sparticlesystem.md#simulate)(float time) | | void [**SetTriggerParticles** ](/scripting/client-scripting-api-reference/components/sparticlesystem.md#settriggerparticles)(SParticleSystemTriggerEventType type, SParticle\[] sp) | | SParticle\[] [**GetTriggerParticles** ](/scripting/client-scripting-api-reference/components/sparticlesystem.md#gettriggerparticles)(SParticleSystemTriggerEventType type) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | Description | | -------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | float [**StartDelay** ](/scripting/client-scripting-api-reference/components/sparticlesystem.md#startdelay)`get` `set` | Start delay in seconds. Use this to delay when playback starts on the system. | | bool [**IsPlaying** ](/scripting/client-scripting-api-reference/components/sparticlesystem.md#isplaying)`get` | Determines whether the Particle System is playing. | | bool [**IsEmitting** ](/scripting/client-scripting-api-reference/components/sparticlesystem.md#isemitting)`get` | Determines whether the Particle System is emitting particles. A Particle System may stop emitting when its emission module has finished, it has been paused or if the system has been stopped. | | bool [**IsStopped** ](/scripting/client-scripting-api-reference/components/sparticlesystem.md#isstopped)`get` | Determines whether the Particle System is stopped. | | bool [**IsPaused** ](/scripting/client-scripting-api-reference/components/sparticlesystem.md#ispaused)`get` | Determines whether the Particle System is paused. | | bool [**Loop** ](/scripting/client-scripting-api-reference/components/sparticlesystem.md#loop)`get` `set` | Specifies whether the Particle System is looping. If you disable looping on a playing Particle System, it stops at the end of the current loop. | | bool [**PlayOnAwake** ](/scripting/client-scripting-api-reference/components/sparticlesystem.md#playonawake)`get` `set` | If set to true, the Particle System will automatically start playing on startup. Note that this setting is shared between all Particle Systems in the current particle effect. | | float [**Time** ](/scripting/client-scripting-api-reference/components/sparticlesystem.md#time)`get` `set` | Playback position in seconds. Use this to read current playback time or to seek to a new playback time. | | float [**Duration** ](/scripting/client-scripting-api-reference/components/sparticlesystem.md#duration)`get` | The duration of the Particle System in seconds. | | float [**PlaybackSpeed** ](/scripting/client-scripting-api-reference/components/sparticlesystem.md#playbackspeed)`get` `set` | The playback speed of the Particle System. 1 is normal playback speed. | | int [**ParticleCount** ](/scripting/client-scripting-api-reference/components/sparticlesystem.md#particlecount)`get` | The current number of particles. | | bool [**EnableEmission** ](/scripting/client-scripting-api-reference/components/sparticlesystem.md#enableemission)`get` `set` | When set to false, the Particle System will not emit particles. | | float [**EmissionRate** ](/scripting/client-scripting-api-reference/components/sparticlesystem.md#emissionrate)`get` `set` | The rate of particle emission. | | float [**EmissionRateOverTime** ](/scripting/client-scripting-api-reference/components/sparticlesystem.md#emissionrateovertime)`get` `set` | The rate at which the emitter spawns new particles over time. | | float [**EmissionRateOverDistance** ](/scripting/client-scripting-api-reference/components/sparticlesystem.md#emissionrateoverdistance)`get` `set` | The rate at which the emitter spawns new particles over distance. The emitter only spawns new particles when it moves. | | float [**StartSpeed** ](/scripting/client-scripting-api-reference/components/sparticlesystem.md#startspeed)`get` `set` | The initial speed of particles when the Particle System first spawns them. | | float [**StartSize** ](/scripting/client-scripting-api-reference/components/sparticlesystem.md#startsize)`get` `set` | The initial size of particles when the Particle System first spawns them. | | SColor [**StartColor** ](/scripting/client-scripting-api-reference/components/sparticlesystem.md#startcolor)`get` `set` | The initial color of particles when the Particle System first spawns them. | | float [**StartRotation** ](/scripting/client-scripting-api-reference/components/sparticlesystem.md#startrotation)`get` `set` | The initial rotation of particles when emitted. When using curves, this value acts as a scale on the curve. Note that the value should be given in radians. | | SVector [**StartRotation3D** ](/scripting/client-scripting-api-reference/components/sparticlesystem.md#startrotation3d)`get` `set` | The initial 3D rotation of particles when emitted. When using curves, this value acts as a scale on the curves. Note that the values are Euler angles and should be given in radians. | | float [**StartLifetime** ](/scripting/client-scripting-api-reference/components/sparticlesystem.md#startlifetime)`get` `set` | The total lifetime in seconds that particles will have when emitted. When using curves, this value acts as a scale on the curve. This value is set in the particle when it is created by the Particle System. | | float [**GravityModifier** ](/scripting/client-scripting-api-reference/components/sparticlesystem.md#gravitymodifier)`get` `set` | A scale that this Particle System applies to gravity. | | int [**MaxParticles** ](/scripting/client-scripting-api-reference/components/sparticlesystem.md#maxparticles)`get` `set` | The maximum number of particles to emit. | | uint [**RandomSeed** ](/scripting/client-scripting-api-reference/components/sparticlesystem.md#randomseed)`get` `set` | Override the random seed used for the Particle System emission. | | bool [**UseAutoRandomSeed** ](/scripting/client-scripting-api-reference/components/sparticlesystem.md#useautorandomseed)`get` `set` | Controls whether the Particle System uses an automatically-generated random number to seed the random number generator. If set to true, the Particle System will generate a new random seed each time it is played. If set to false, ParticleSystem.randomSeed will be used instead, allowing for a constant seed (useful if you want your particles to play in exactly the same way each time) or user-defined random value (for example, you may want to cycle through an array of seeds). | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/sparticlesystem.md#gameobject)`get` | | #### Functions[​](#functions "Direct link to Functions") ##### Play[​](#play "Direct link to Play") void **Play** (bool withChildren)
void **Play** () *Sets the Particle Systems into play mode and enables emitting (if it has been disabled).* *If the Particle System has been paused, then this resumes playing from the previous time. If the Particle System has stopped, then the system starts from time 0, and, if it is relevant, the startDelay is applied. Parameter withChildren: Plays all child Particle Systems as well.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.ParticleSystem.Play() --or Space.Host.ExecutingObject.ParticleSystem.Play(true) ``` ##### Stop[​](#stop "Direct link to Stop") void **Stop** (bool withChildren)
void **Stop** () *Stops playing the Particle System. Parameter withChildren: Plays all child Particle Systems as well.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.ParticleSystem.Stop() --or Space.Host.ExecutingObject.ParticleSystem.Stop(true) ``` ##### Pause[​](#pause "Direct link to Pause") void **Pause** (bool withChildren)
void **Pause** () *Pauses the system so no new particles are emitted and the existing particles are not updated. Parameter: withChildren: Pauses all child Particle Systems as well.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.ParticleSystem.Pause() --or Space.Host.ExecutingObject.ParticleSystem.Pause(true) ``` ##### Clear[​](#clear "Direct link to Clear") void **Clear** (bool withChildren)
void **Clear** () *Remove all particles in the Particle System.* *This method also removes the particles from any linked sub-emitters. Use the withChildren parameter to remove particles from child Particle Systems that are not sub-emitters of the system.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.ParticleSystem.Clear() --or Space.Host.ExecutingObject.ParticleSystem.Clear(true) ``` ##### IsAlive[​](#isalive "Direct link to IsAlive") bool **IsAlive** (bool withChildren) *Returns True if the Particle System contains live particles or is still creating new particles. False if the Particle System has stopped emitting particles and all particles are dead. Parameter withChildren: checks all child Particle Systems as well.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua isAlive = Space.Host.ExecutingObject.ParticleSystem.IsAlive() --or isAlive = Space.Host.ExecutingObject.ParticleSystem.IsAlive(true) ``` ##### Emit[​](#emit "Direct link to Emit") void **Emit** (int count) *Emit 'count' particles immediately.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.ParticleSystem.Emit(100) ``` ##### Simulate[​](#simulate "Direct link to Simulate") void **Simulate** (float time) *Fast-forwards the Particle System by simulating particles over 'time' seconds, then pauses it.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.ParticleSystem.Simulate(5.0) ``` ##### SetTriggerParticles[​](#settriggerparticles "Direct link to SetTriggerParticles") void **SetTriggerParticles** (int type, [SParticle](/scripting/client-scripting-api-reference/types/sparticle.md)\[] sp) *Write modified particles back to the Particle System, during a call to OnParticleTrigger. type - Type of trigger to return particles for. sp -- Particle array* | Parameter | Type | Description | | --------- | ---------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | | type | int | *Type of trigger to return particles for.*
*1 = Inside*
*2 = Outside*
*3 = Enter*
*4 = Exit* | | sp | [SParticle](/scripting/client-scripting-api-reference/types/sparticle.md)\[] | A table of SParticle | * Lua ```lua Space.Host.ExecutingObject.ParticleSystem.SetTriggerParticles(0,ParticlesArray) ``` ##### GetTriggerParticles[​](#gettriggerparticles "Direct link to GetTriggerParticles") [SParticle](/scripting/client-scripting-api-reference/types/sparticle.md)\[] **GetTriggerParticles** (int type) *Get the particles that met the condition in the particle trigger module. his method is typically called from MonoBehaviour.OnParticleTrigger in response to a trigger callback.* | Parameter | Type | Description | | --------- | ---- | ---------------------------------------------------------------------------------------------------------------- | | type | int | *Type of trigger to return particles for.*
*1 = Inside*
*2 = Outside*
*3 = Enter*
*4 = Exit* | * Lua ```lua ParticlesArray = Space.Host.ExecutingObject.ParticleSystem.GetTriggerParticles(0) ``` #### Properties[​](#properties "Direct link to Properties") ##### StartDelay[​](#startdelay "Direct link to StartDelay") float **StartDelay** `get` `set` *Start delay in seconds. Use this to delay when playback starts on the system.* * Lua ```lua Space.Host.ExecutingObject.ParticleSystem.StartDelay = 5 ``` ##### IsPlaying[​](#isplaying "Direct link to IsPlaying") bool **IsPlaying** `get` *Determines whether the Particle System is playing.* * Lua ```lua isPlaying = Space.Host.ExecutingObject.ParticleSystem.IsPlaying ``` ##### IsEmitting[​](#isemitting "Direct link to IsEmitting") bool **IsEmitting** `get` *Determines whether the Particle System is emitting particles. A Particle System may stop emitting when its emission module has finished, it has been paused or if the system has been stopped.* * Lua ```lua isEmitting = Space.Host.ExecutingObject.ParticleSystem.IsEmitting ``` ##### IsStopped[​](#isstopped "Direct link to IsStopped") bool **IsStopped** `get` *Determines whether the Particle System is stopped.* * Lua ```lua isStopped = Space.Host.ExecutingObject.ParticleSystem.IsStopped ``` ##### IsPaused[​](#ispaused "Direct link to IsPaused") bool **IsPaused** `get` *Determines whether the Particle System is paused.* * Lua ```lua isPaused = Space.Host.ExecutingObject.ParticleSystem.IsPaused ``` ##### Loop[​](#loop "Direct link to Loop") bool **Loop** `get` `set` *Specifies whether the Particle System is looping. If you disable looping on a playing Particle System, it stops at the end of the current loop.* * Lua ```lua Space.Host.ExecutingObject.ParticleSystem.Loop = true ``` ##### PlayOnAwake[​](#playonawake "Direct link to PlayOnAwake") bool **PlayOnAwake** `get` `set` *If set to true, the Particle System will automatically start playing on startup. Note that this setting is shared between all Particle Systems in the current particle effect.* * Lua ```lua Space.Host.ExecutingObject.ParticleSystem.PlayOnAwake ``` ##### Time[​](#time "Direct link to Time") float **Time** `get` `set` *Playback position in seconds. Use this to read current playback time or to seek to a new playback time.* * Lua ```lua Space.Host.ExecutingObject.ParticleSystem.Time = 5.0 ``` ##### Duration[​](#duration "Direct link to Duration") float **Duration** `get` *The duration of the Particle System in seconds.* * Lua ```lua duration = Space.Host.ExecutingObject.ParticleSystem.Duration ``` ##### PlaybackSpeed[​](#playbackspeed "Direct link to PlaybackSpeed") float **PlaybackSpeed** `get` `set` *The playback speed of the Particle System. 1 is normal playback speed.* * Lua ```lua Space.Host.ExecutingObject.ParticleSystem.PlaybackSpeed = 1.5 ``` ##### ParticleCount[​](#particlecount "Direct link to ParticleCount") int **ParticleCount** `get` *The current number of particles.* * Lua ```lua count = Space.Host.ExecutingObject.ParticleSystem.ParticleCount ``` ##### EnableEmission[​](#enableemission "Direct link to EnableEmission") bool **EnableEmission** `get` `set` *When set to false, the Particle System will not emit particles.* * Lua ```lua Space.Host.ExecutingObject.ParticleSystem.EnableEmission = true ``` ##### EmissionRate[​](#emissionrate "Direct link to EmissionRate") float **EmissionRate** `get` `set` *The rate of particle emission.* * Lua ```lua Space.Host.ExecutingObject.ParticleSystem.EmissionRate = 10 ``` ##### EmissionRateOverTime[​](#emissionrateovertime "Direct link to EmissionRateOverTime") float **EmissionRateOverTime** `get` `set` *The rate at which the emitter spawns new particles over time.* * Lua ```lua Space.Host.ExecutingObject.ParticleSystem.EmissionRateOverTime = 10 ``` ##### EmissionRateOverDistance[​](#emissionrateoverdistance "Direct link to EmissionRateOverDistance") float **EmissionRateOverDistance** `get` `set` *The rate at which the emitter spawns new particles over distance. The emitter only spawns new particles when it moves.* * Lua ```lua Space.Host.ExecutingObject.ParticleSystem.EmissionRateOverDistance = 10 ``` ##### StartSpeed[​](#startspeed "Direct link to StartSpeed") float **StartSpeed** `get` `set` *The initial speed of particles when the Particle System first spawns them.* * Lua ```lua Space.Host.ExecutingObject.ParticleSystem.StartSpeed = 10 ``` ##### StartSize[​](#startsize "Direct link to StartSize") float **StartSize** `get` `set` *The initial size of particles when the Particle System first spawns them.* * Lua ```lua Space.Host.ExecutingObject.ParticleSystem.StartSize = 1.2 ``` ##### StartColor[​](#startcolor "Direct link to StartColor") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **StartColor** `get` `set` *The initial color of particles when the Particle System first spawns them.* * Lua ```lua Space.Host.ExecutingObject.ParticleSystem.StartColor = Color.Red ``` ##### StartRotation[​](#startrotation "Direct link to StartRotation") float **StartRotation** `get` `set` *The initial rotation of particles when emitted. When using curves, this value acts as a scale on the curve. Note that the value should be given in radians.* * Lua ```lua Space.Host.ExecutingObject.ParticleSystem.StartRotation = 20.5 ``` ##### StartRotation3D[​](#startrotation3d "Direct link to StartRotation3D") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **StartRotation3D** `get` `set` *The initial 3D rotation of particles when emitted. When using curves, this value acts as a scale on the curves. Note that the values are Euler angles and should be given in radians.* * Lua ```lua Space.Host.ExecutingObject.ParticleSystem.StartRotation3D = Vector.New(0,20,20) ``` ##### StartLifetime[​](#startlifetime "Direct link to StartLifetime") float **StartLifetime** `get` `set` *The total lifetime in seconds that particles will have when emitted. When using curves, this value acts as a scale on the curve. This value is set in the particle when it is created by the Particle System.* * Lua ```lua Space.Host.ExecutingObject.ParticleSystem.StartLifetime = 20 ``` ##### GravityModifier[​](#gravitymodifier "Direct link to GravityModifier") float **GravityModifier** `get` `set` *A scale that this Particle System applies to gravity.* * Lua ```lua Space.Host.ExecutingObject.ParticleSystem.GravityModifier = 1.2 ``` ##### MaxParticles[​](#maxparticles "Direct link to MaxParticles") int **MaxParticles** `get` `set` *The maximum number of particles to emit.* * Lua ```lua Space.Host.ExecutingObject.ParticleSystem.MaxParticles = 500 ``` ##### RandomSeed[​](#randomseed "Direct link to RandomSeed") uint **RandomSeed** `get` `set` *Override the random seed used for the Particle System emission.* * Lua ```lua Space.Host.ExecutingObject.ParticleSystem.RandomSeed = 23423423 ``` * Lua ```lua spawningparticles = Space.Scene.Find("Particles") --get particle object and get the particle system component on it. particles=spawningparticles.ParticleSystem --set random seed. particles.UseAutoRandomSeed = false particles.RandomSeed = 123456 ``` ##### UseAutoRandomSeed[​](#useautorandomseed "Direct link to UseAutoRandomSeed") bool **UseAutoRandomSeed** `get` `set` *Controls whether the Particle System uses an automatically-generated random number to seed the random number generator. If set to true, the Particle System will generate a new random seed each time it is played. If set to false, ParticleSystem.randomSeed will be used instead, allowing for a constant seed (useful if you want your particles to play in exactly the same way each time) or user-defined random value (for example, you may want to cycle through an array of seeds).* * Lua ```lua Space.Host.ExecutingObject.ParticleSystem.UseAutoRandomSeed = true ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua ```lua theGameObject = Space.Host.ExecutingObject.ParticleSystem.GameObject ``` --- ### SPlayableDirector #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | ------------------------------------------------------------------------------------------------------ | | void [**Play** ](/scripting/client-scripting-api-reference/components/splayabledirector.md#play)() | | void [**Stop** ](/scripting/client-scripting-api-reference/components/splayabledirector.md#stop)() | | void [**Pause** ](/scripting/client-scripting-api-reference/components/splayabledirector.md#pause)() | | void [**Resume** ](/scripting/client-scripting-api-reference/components/splayabledirector.md#resume)() | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | --------------------------------------------------------------------------------------------------------------------------- | | int [**State** ](/scripting/client-scripting-api-reference/components/splayabledirector.md#state)`get` | | double [**Time** ](/scripting/client-scripting-api-reference/components/splayabledirector.md#time)`get` `set` | | double [**InitialTime** ](/scripting/client-scripting-api-reference/components/splayabledirector.md#initialtime)`get` `set` | | double [**Duration** ](/scripting/client-scripting-api-reference/components/splayabledirector.md#duration)`get` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/splayabledirector.md#gameobject)`get` | #### Functions[​](#functions "Direct link to Functions") ##### Play[​](#play "Direct link to Play") void **Play** () *Instantiates a Playable using the provided PlayableAsset and starts playback.* * Lua ```lua Space.Host.ExecutingObject.Director.Play() ``` ##### Stop[​](#stop "Direct link to Stop") void **Stop** () *Stop playback of the current Playable and destroys the corresponding graph.* * Lua ```lua Space.Host.ExecutingObject.Director.Stop() ``` ##### Pause[​](#pause "Direct link to Pause") void **Pause** () *Pause playback of the currently running playable.* * Lua ```lua Space.Host.ExecutingObject.Director.Pause() ``` ##### Resume[​](#resume "Direct link to Resume") void **Resume** () *Resume playing a paused playable.* * Lua ```lua Space.Host.ExecutingObject.Director.Resume() ``` #### Properties[​](#properties "Direct link to Properties") ##### State[​](#state "Direct link to State") int **State** `get` *The current playing state of the component.* * Lua ```lua intState = Space.Host.ExecutingObject.Director.State ``` ##### Time[​](#time "Direct link to Time") double **Time** `get` `set` *The component's current time. This value is incremented according to the PlayableDirector.timeUpdateMode when it is playing. You can also change this value manually.* * Lua ```lua Space.Host.ExecutingObject.Director.Time = 10 ``` ##### InitialTime[​](#initialtime "Direct link to InitialTime") double **InitialTime** `get` `set` *The time at which the Playable should start when first played.* * Lua ```lua Space.Host.ExecutingObject.Director.Time = 2 ``` ##### Duration[​](#duration "Direct link to Duration") double **Duration** `get` *The duration of the Playable in seconds.* * Lua ```lua duration = Space.Host.ExecutingObject.Director.Duration ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua ```lua theGameObject = Space.Host.ExecutingObject.Director.GameObject ``` --- ### SPostProcessVolume #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | -------------------------------------------------------------------------------------------------------------------------------- | | bool [**Enabled** ](/scripting/client-scripting-api-reference/components/spostprocessvolume.md#enabled)`get` `set` | | bool [**IsGlobal** ](/scripting/client-scripting-api-reference/components/spostprocessvolume.md#isglobal)`get` `set` | | float? [**BlendDistance** ](/scripting/client-scripting-api-reference/components/spostprocessvolume.md#blenddistance)`get` `set` | | float?? [**Weight** ](/scripting/client-scripting-api-reference/components/spostprocessvolume.md#weight)`get` `set` | | float [**Priority** ](/scripting/client-scripting-api-reference/components/spostprocessvolume.md#priority)`get` `set` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/spostprocessvolume.md#gameobject)`get` | #### Properties[​](#properties "Direct link to Properties") ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` *Enable or disable post effect volume.* * Lua ```lua Space.Host.ExecutingObject.PostProcessVolume.Enabled = true ``` * Lua ```lua --clicking this object will Enable/Disable it's Post Process Volume component thisGameObject = Space.Host.ExecutingObject component = thisGameObject.PostProcessVolume OnClick = function() component.Enabled = not component.Enabled end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### IsGlobal[​](#isglobal "Direct link to IsGlobal") bool **IsGlobal** `get` `set` *Should this volume be applied to the whole scene?* * Lua ```lua Space.Host.ExecutingObject.PostProcessVolume.IsGlobal = true ``` ##### BlendDistance[​](#blenddistance "Direct link to BlendDistance") float? **BlendDistance** `get` `set` *The outer distance to start blending from. A value of 0 means no blending and the volume overrides will be applied immediately upon entry.* * Lua ```lua Space.Host.ExecutingObject.PostProcessVolume.BlendDistance = 0 ``` ##### Weight[​](#weight "Direct link to Weight") float?? **Weight** `get` `set` *The total weight of this volume in the scene. 0 means it won't do anything, 1 means full effect.* * Lua ```lua Space.Host.ExecutingObject.PostProcessVolume.Weight = 1 ``` ##### Priority[​](#priority "Direct link to Priority") float **Priority** `get` `set` *The volume priority in the stack. Higher number means higher priority. Negative values are supported.* * Lua ```lua Space.Host.ExecutingObject.PostProcessVolume.Priority = 100 ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua ```lua theGameObject = Space.Host.ExecutingObject.PostProcessVolume.GameObject ``` --- ### SRectTransform #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | void [**SetParent** ](/scripting/client-scripting-api-reference/components/srecttransform.md#setparent)(SGameObject parent, bool worldPositionStays) | | void [**SetInsetAndSizeFromParentEdge** ](/scripting/client-scripting-api-reference/components/srecttransform.md#setinsetandsizefromparentedge)(int edge, float inset, float size) | | void [**SetSizeWithCurrentAnchors** ](/scripting/client-scripting-api-reference/components/srecttransform.md#setsizewithcurrentanchors)(bool vertical, float size) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | --------------------------------------------------------------------------------------------------------------------------------------- | | SRect [**Rect** ](/scripting/client-scripting-api-reference/components/srecttransform.md#rect)`get` | | SVector [**anchorMin** ](/scripting/client-scripting-api-reference/components/srecttransform.md#anchormin)`get` `set` | | SVector [**anchorMax** ](/scripting/client-scripting-api-reference/components/srecttransform.md#anchormax)`get` `set` | | SVector [**anchoredPosition3D** ](/scripting/client-scripting-api-reference/components/srecttransform.md#anchoredposition3d)`get` `set` | | SVector [**anchoredPosition** ](/scripting/client-scripting-api-reference/components/srecttransform.md#anchoredposition)`get` `set` | | SVector [**sizeDelta** ](/scripting/client-scripting-api-reference/components/srecttransform.md#sizedelta)`get` `set` | | SVector [**pivot** ](/scripting/client-scripting-api-reference/components/srecttransform.md#pivot)`get` `set` | | SVector [**offsetMin** ](/scripting/client-scripting-api-reference/components/srecttransform.md#offsetmin)`get` `set` | | SVector [**offsetMax** ](/scripting/client-scripting-api-reference/components/srecttransform.md#offsetmax)`get` `set` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/srecttransform.md#gameobject)`get` | #### Functions[​](#functions "Direct link to Functions") ##### SetParent[​](#setparent "Direct link to SetParent") void **SetParent** ([SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) parent, bool worldPositionStays) *Set the parent of the transform.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.RectTransform.SetParent(anotherGameObject) ``` ##### SetInsetAndSizeFromParentEdge[​](#setinsetandsizefromparentedge "Direct link to SetInsetAndSizeFromParentEdge") void **SetInsetAndSizeFromParentEdge** (int edge, float inset, float size) *Set the distance of this rectangle relative to a specified edge of the parent rectangle, while also setting its size.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.RectTransform.SetInsetAndSizeFromParentEdge(2, 3.0, 10.0) ``` ##### SetSizeWithCurrentAnchors[​](#setsizewithcurrentanchors "Direct link to SetSizeWithCurrentAnchors") void **SetSizeWithCurrentAnchors** (bool vertical, float size) *Makes the RectTransform calculated rect be a given size on the specified axis.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.RectTransform.SetSizeWithCurrentAnchors(true, 10.0) ``` #### Properties[​](#properties "Direct link to Properties") ##### Rect[​](#rect "Direct link to Rect") [SRect](/scripting/client-scripting-api-reference/types/srect.md) **Rect** `get` *Property Description* * Lua ```lua rect = Space.Host.ExecutingObject.RectTransform.Rect ``` ##### anchorMin[​](#anchormin "Direct link to anchorMin") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **anchorMin** `get` `set` *The normalized position in the parent RectTransform that the lower left corner is anchored to.* * Lua ```lua Space.Host.ExecutingObject.RectTransform.anchorMin= Vector.New(0.3,0.3,0) ``` ##### anchorMax[​](#anchormax "Direct link to anchorMax") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **anchorMax** `get` `set` *Property Description* * Lua ```lua Space.Host.ExecutingObject.RectTransform.anchorMax= Vector.New(0.7,0.6,0) ``` ##### anchoredPosition3D[​](#anchoredposition3d "Direct link to anchoredPosition3D") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **anchoredPosition3D** `get` `set` *Property Description* * Lua ```lua Space.Host.ExecutingObject.RectTransform.anchoredPosition3D= Vector.New(0.7,0.6,0) ``` ##### anchoredPosition[​](#anchoredposition "Direct link to anchoredPosition") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **anchoredPosition** `get` `set` *Property Description* * Lua ```lua Space.Host.ExecutingObject.RectTransform.anchoredPosition= Vector.New(0.7,0.6,0) ``` ##### sizeDelta[​](#sizedelta "Direct link to sizeDelta") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **sizeDelta** `get` `set` *The size of this RectTransform relative to the distances between the anchors.* * Lua ```lua Space.Host.ExecutingObject.RectTransform.sizeDelta= Vector.New(90,90,0) ``` ##### pivot[​](#pivot "Direct link to pivot") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **pivot** `get` `set` *The normalized position in this RectTransform that it rotates around.* * Lua ```lua Space.Host.ExecutingObject.RectTransform.pivot= Vector.New(0.4,0.4,0) ``` ##### offsetMin[​](#offsetmin "Direct link to offsetMin") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **offsetMin** `get` `set` *The offset of the lower left corner of the rectangle relative to the lower left anchor.* * Lua ```lua Space.Host.ExecutingObject.RectTransform.offsetMin= Vector.New(-50,-50,0) ``` ##### offsetMax[​](#offsetmax "Direct link to offsetMax") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **offsetMax** `get` `set` *The offset of the upper right corner of the rectangle relative to the upper right anchor.* * Lua ```lua Space.Host.ExecutingObject.RectTransform.offsetMax= Vector.New(50,50,0) ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua ```lua theGameObject = Space.Host.ExecutingObject.RectTransform.GameObject ``` --- ### SReflectionProbe #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | ---------------------------------------------------------------------------------------------------------------- | | void [**RenderProbe** ](/scripting/client-scripting-api-reference/components/sreflectionprobe.md#functionname)() | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ----------------------------------------------------------------------------------------------------------------------- | | SVector [**Center** ](/scripting/client-scripting-api-reference/components/sreflectionprobe.md#center)`get` `set` | | SVector [**Size** ](/scripting/client-scripting-api-reference/components/sreflectionprobe.md#size)`get` `set` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/sreflectionprobe.md#gameobject)`get` | #### Functions[​](#functions "Direct link to Functions") ##### RenderProbe[​](#renderprobe "Direct link to RenderProbe") void **RenderProbe** () *Refreshes the probe's cubemap.* * Lua ```lua Space.Host.ExecutingObject.ReflectionProbe.RenderProbe() ``` #### Properties[​](#properties "Direct link to Properties") ##### Center[​](#center "Direct link to Center") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **Center** `get` `set` *The center of the box area in which reflections will be applied to the objects. Measured in the probe's local space.* * Lua ```lua vectorCenter = Space.Host.ExecutingObject.ReflectionProbe.Center ``` ##### Size[​](#size "Direct link to Size") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **Size** `get` `set` *The size of the box area in which reflections will be applied to the objects. Measured in the probe's local space.* * Lua ```lua vectorSize = Space.Host.ExecutingObject.ReflectionProbe.Size ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua ```lua theGameObject = Space.Host.ExecutingObject.ReflectionProbe.GameObject ``` --- ### SRenderer #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | --------------------------------------------------------------------------------------------------------------------------------- | | bool [**IsVisible** ](/scripting/client-scripting-api-reference/components/srenderer.md#isvisible)`get` | | bool [**Enabled** ](/scripting/client-scripting-api-reference/components/srenderer.md#enabled)`get` `set` | | SMaterial [**Material** ](/scripting/client-scripting-api-reference/components/srenderer.md#material)`get` `set` | | SMaterial [**SharedMaterial** ](/scripting/client-scripting-api-reference/components/srenderer.md#sharedmaterial)`get` `set` | | SMaterial\[] [**Materials** ](/scripting/client-scripting-api-reference/components/srenderer.md#materials)`get` `set` | | SMaterial\[] [**SharedMaterials** ](/scripting/client-scripting-api-reference/components/srenderer.md#sharedmaterials)`get` `set` | | SVector [**BoundsMax** ](/scripting/client-scripting-api-reference/components/srenderer.md#boundsmax)`get` | | SVector [**BoundsMin** ](/scripting/client-scripting-api-reference/components/srenderer.md#boundsmin)`get` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/srenderer.md#gameobject)`get` | #### Properties[​](#properties "Direct link to Properties") ##### IsVisible[​](#isvisible "Direct link to IsVisible") bool **IsVisible** `get` *Returns true if the renderer is visible on any camera. Note that the object is considered visible when it needs to be rendered in the Scene. For example, it might not actually be visible by any camera but still need to be rendered for shadows. When running in the editor, the Scene view cameras will also cause this value to be true.* * Lua ```lua isVisible = Space.Host.ExecutingObject.Renderer.IsVisible ``` * Lua ```lua --this object will move forward only if visible on a camera thisObject = Space.Host.ExecutingObject function OnUpdateFunction() if thisObject.Renderer.IsVisible then thisObject.WorldPosition = thisObject.WorldPosition + (thisObject.Forward * Space.DeltaTime * 0.2) end end thisObject.OnUpdate(OnUpdateFunction) ``` ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` *Get/Set if the rendered object is visible.* * Lua ```lua Space.Host.ExecutingObject.Renderer.Enabled = false ``` * Lua ```lua --clicking this object will make it disappear/reappear thisGameObject = Space.Host.ExecutingObject OnClick = function() thisGameObject.Renderer.Enabled = not thisGameObject.Renderer.Enabled end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### Material[​](#material "Direct link to Material") [SMaterial](/scripting/client-scripting-api-reference/types/smaterial.md) **Material** `get` `set` *Returns the first instantiated Material assigned to the renderer.* *Modifying material will change the material for this object only.* *If the material is used by any other renderers, this will clone the shared material and start using it from now on.* * Lua ```lua Space.Host.ExecutingObject.Renderer.Material.SetColor("_Color", 1.0, 0.5, 0.5, 1.0) ``` * Lua ```lua --clicking this object will toggle it's material's color between Red and Black color when clicked thisObject = Space.Host.ExecutingObject function OnClickFunction() if thisObject.Renderer.Material.GetColor("_Color") == Color.Black then thisObject.Renderer.Material.SetColor("_Color", Color.Red) else thisObject.Renderer.Material.SetColor("_Color", Color.Black) end end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### SharedMaterial[​](#sharedmaterial "Direct link to SharedMaterial") [SMaterial](/scripting/client-scripting-api-reference/types/smaterial.md) **SharedMaterial** `get` `set` *The shared material of this object.* *Modifying sharedMaterial will change the appearance of all objects using this material, and change material settings that are stored in the project too.* *It is not recommended to modify materials returned by sharedMaterial. If you want to modify the material of a renderer use material instead.* * Lua ```lua Space.Host.ExecutingObject.Renderer.SharedMaterial.SetColor("_Color", 1.0, 0.5, 0.5, 1.0) ``` * Lua ```lua --clicking this object will toggle it's shared material's color between Red and Black color when clicked thisObject = Space.Host.ExecutingObject function OnClickFunction() if thisObject.Renderer.SharedMaterial.GetColor("_Color") == Color.Black then thisObject.Renderer.SharedMaterial.SetColor("_Color", Color.Red) else thisObject.Renderer.SharedMaterial.SetColor("_Color", Color.Black) end end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### Materials[​](#materials "Direct link to Materials") [SMaterial](/scripting/client-scripting-api-reference/types/smaterial.md)\[] **Materials** `get` `set` *Returns all the instantiated materials of this object.* *This is an array of all materials used by the renderer. Unity supports a single object using multiple materials; in this case materials contains all the materials. sharedMaterial and material properties return the first used material if there is more than one.* *Modifying any material in materials will change the appearance of only that object.* *Note that like all arrays returned by Unity, this returns a copy of materials array. If you want to change some materials in it, get the value, change an entry and set materials back.* * Lua ```lua mats = Space.Host.ExecutingObject.Renderer.Materials ``` ##### SharedMaterials[​](#sharedmaterials "Direct link to SharedMaterials") [SMaterial](/scripting/client-scripting-api-reference/types/smaterial.md)\[] **SharedMaterials** `get` `set` *All the shared materials of this object.* *This is an array of all materials used by the renderer. Unity supports a single object using multiple materials; in this case sharedMaterials contains all the materials. sharedMaterial and material properties return the first used material if there is more than one.* *Modifying any material in sharedMaterials will change the appearance of all objects using this material, and change material settings that are stored in the project too.* *It is not recommended to modify materials returned by sharedMaterials. If you want to modify the material of a renderer use material instead.* *Note that like all arrays returned by Unity, this returns a copy of materials array. If you want to change some materials in it, get the value, change an entry and set materials back.* * Lua ```lua sharedMats = Space.Host.ExecutingObject.Renderer.SharedMaterials ``` ##### BoundsMax[​](#boundsmax "Direct link to BoundsMax") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **BoundsMax** `get` *Property Description* * Lua ```lua vectorBoundsMax = Space.Host.ExecutingObject.Renderer.BoundsMax ``` ##### BoundsMin[​](#boundsmin "Direct link to BoundsMin") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **BoundsMin** `get` *Property Description* * Lua ```lua vectorBoundsMin = Space.Host.ExecutingObject.Renderer.BoundsMin ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua ```lua theGameObject = Space.Host.ExecutingObject.Renderer.GameObject ``` --- ### SRigidbody #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | void [**AddExplosionForce** ](/scripting/client-scripting-api-reference/components/srigidbody.md#addexplosionforce)(float explosionForce, SVector explosionPosition, float explosionRadius, float upwardsModifier) | | void [**AddForce** ](/scripting/client-scripting-api-reference/components/srigidbody.md#addforce)(SVector force) | | void [**AddForceAtPosition** ](/scripting/client-scripting-api-reference/components/srigidbody.md#addforceatposition)(SVector force, SVector position) | | void [**AddRelativeTorque** ](/scripting/client-scripting-api-reference/components/srigidbody.md#addrelativetorque)(SVector torque) | | void [**AddTorque** ](/scripting/client-scripting-api-reference/components/srigidbody.md#addtorque)(SVector torque) | | SVector [**ClosestPointOnBounds** ](/scripting/client-scripting-api-reference/components/srigidbody.md#closestpointonbounds)(SVector input) | | SVector [**GetPointVelocity** ](/scripting/client-scripting-api-reference/components/srigidbody.md#getpointvelocity)(SVector worldPoint) | | SVector [**GetRelativePointVelocity** ](/scripting/client-scripting-api-reference/components/srigidbody.md#getrelativepointvelocity)(SVector point) | | void [**MovePosition** ](/scripting/client-scripting-api-reference/components/srigidbody.md#moveposition)(SVector point) | | void [**MoveRotation** ](/scripting/client-scripting-api-reference/components/srigidbody.md#moverotation)(SQuaternion rotation) | | void [**ResetCenterOfMass** ](/scripting/client-scripting-api-reference/components/srigidbody.md#resetcenterofmass)() | | void [**ResetIntertiaTensor** ](/scripting/client-scripting-api-reference/components/srigidbody.md#resetintertiatensor)() | | void [**Sleep** ](/scripting/client-scripting-api-reference/components/srigidbody.md#sleep)() | | void [**WakeUp** ](/scripting/client-scripting-api-reference/components/srigidbody.md#wakeup)() | | SPhysicsHit\[] [**SweepTestAll** ](/scripting/client-scripting-api-reference/components/srigidbody.md#sweeptestall)(SVector direction, float distance) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | --------------------------------------------------------------------------------------------------------------------------------------------- | | float [**AngularDrag** ](/scripting/client-scripting-api-reference/components/srigidbody.md#angulardrag)`get` `set` | | SVector [**AngularVelocity** ](/scripting/client-scripting-api-reference/components/srigidbody.md#angularvelocity)`get` `set` | | SVector [**CenterOfMass** ](/scripting/client-scripting-api-reference/components/srigidbody.md#centerofmass)`get` `set` | | float [**Drag** ](/scripting/client-scripting-api-reference/components/srigidbody.md#drag)`get` `set` | | bool [**FreezeRotation** ](/scripting/client-scripting-api-reference/components/srigidbody.md#freezerotation)`get` `set` | | bool [**Kinematic** ](/scripting/client-scripting-api-reference/components/srigidbody.md#kinematic)`get` `set` | | float [**Mass** ](/scripting/client-scripting-api-reference/components/srigidbody.md#mass)`get` `set` | | float [**MaxAngularVelocity** ](/scripting/client-scripting-api-reference/components/srigidbody.md#maxangularvelocity)`get` `set` | | float [**MaxDepenetrationVelocity** ](/scripting/client-scripting-api-reference/components/srigidbody.md#maxdepenetrationvelocity)`get` `set` | | bool [**UseGravity** ](/scripting/client-scripting-api-reference/components/srigidbody.md#usegravity)`get` `set` | | SVector [**Velocity** ](/scripting/client-scripting-api-reference/components/srigidbody.md#velocity)`get` `set` | | SVector [**WorldCenterOfMass** ](/scripting/client-scripting-api-reference/components/srigidbody.md#worldcenterofmass)`get` | | bool [**Sleeping** ](/scripting/client-scripting-api-reference/components/srigidbody.md#sleeping)`get` | | float [**Density** ](/scripting/client-scripting-api-reference/components/srigidbody.md#density)`set` | | SVector [**InertiaTensor** ](/scripting/client-scripting-api-reference/components/srigidbody.md#inertiatensor)`get` `set` | | SQuaternion [**InertiaTensorRotation** ](/scripting/client-scripting-api-reference/components/srigidbody.md#inertiatensorrotation)`get` `set` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/srigidbody.md#gameobject)`get` | #### Functions[​](#functions "Direct link to Functions") ##### AddExplosionForce[​](#addexplosionforce "Direct link to AddExplosionForce") void **AddExplosionForce** (float explosionForce, [SVector](/scripting/client-scripting-api-reference/types/svector.md) explosionPosition, float explosionRadius, float upwardsModifier) *Applies a force to a rigidbody that simulates explosion effects. Other rigidbodies will be affected by the explosion within its radius - the closer they are to the explosionPosition, the stronger the force will be exerted on them.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Rigidbody.AddExplosionForce (300, Vector.New(0,0,0), 10, 20) ``` * Lua ```lua local obj = Space.Host.ExecutingObject; obj.Rigidbody.AddExplosionForce (300, obj.WorldPosition, 10, 20) -- The explosion will occur at the location of the ExecutingObject. -- Place other rigidbodies around it to observe the effect! ``` ##### AddForce[​](#addforce "Direct link to AddForce") void **AddForce** ([SVector](/scripting/client-scripting-api-reference/types/svector.md) force) *Adds a force to the Rigidbody that is continuously exerted on it in the given direction.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Rigidbody.AddForce(Vector.New(0,1,0)) ``` * Lua ```lua local obj = Space.Host.ExecutingObject; obj.Rigidbody.AddForce (Vector.New(0,100,0)); -- Now the rigidbody is under a continuous force directed upwards (Y direction) ``` ##### AddForceAtPosition[​](#addforceatposition "Direct link to AddForceAtPosition") void **AddForceAtPosition** ([SVector](/scripting/client-scripting-api-reference/types/svector.md) force,[ SVector](/scripting/client-scripting-api-reference/types/svector.md) position) *Adds a force to the Rigidbody at a given position (should be within the range of the rigidbody for a realistic result). Thus, both a torque and force are applied to the object.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Rigidbody.AddForceAtPosition(Vector.New(1,1,1), Vector.New(0,1,0)) ``` * Lua ```lua local obj = Space.Host.ExecutingObject; local applyForceHere = Vector.New(obj.WorldPosition.x-0.5,obj.WorldPosition.y-0.5,obj.WorldPosition.z-0.5) -- This vector is equivalent to one of the lower corners of a 1x1x1 cube. obj.Rigidbody.AddForceAtPosition (Vector.New(0,40,0), applyForceHere); -- The object is experiencing an effect similar to being tipped upwards at the aforementioned corner. ``` ##### AddRelativeTorque[​](#addrelativetorque "Direct link to AddRelativeTorque") void **AddRelativeTorque** ([SVector](/scripting/client-scripting-api-reference/types/svector.md) torque) *Adds a torque to the rigidbody relative to the local coordinate system.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Rigidbody.AddRelativeTorque(Vector.New(0,1,0)) ``` * Lua ```lua local obj = Space.Host.ExecutingObject; obj.Rigidbody.AddRelativeTorque (Vector.New(0,100,0)); -- Now the object spins about its own Y axis ``` ##### AddTorque[​](#addtorque "Direct link to AddTorque") void **AddTorque** ([SVector](/scripting/client-scripting-api-reference/types/svector.md) torque) *Adds a torque to the rigidbody relative to the global coordinate system.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Rigidbody.AddTorque(Vector.New(0,1,0)) ``` * Lua ```lua local obj = Space.Host.ExecutingObject; obj.Rigidbody.AddTorque (Vector.New(0,100,0)); -- Now the object spins about the global Y axis ``` ##### ClosestPointOnBounds[​](#closestpointonbounds "Direct link to ClosestPointOnBounds") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **ClosestPointOnBounds** ([SVector](/scripting/client-scripting-api-reference/types/svector.md) input) *Returns the closest point on the bounding box of the attached colliders.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Rigidbody.ClosestPointOnBounds(Vector.New(1,1,1)) ``` * Lua ```lua local obj = Space.Host.ExecutingObject; Space.Log(obj.Rigidbody.ClosestPointOnBounds (Vector.Zero)); -- prints [x,y,z] to the console, where x,y,z are coordinates of the rigidbody's point that is the closest to the global origin ``` ##### GetPointVelocity[​](#getpointvelocity "Direct link to GetPointVelocity") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **GetPointVelocity** ([SVector](/scripting/client-scripting-api-reference/types/svector.md) worldPoint) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Rigidbody.GetPointVelocity(Vector.New(0,1,0)) ``` ##### GetRelativePointVelocity[​](#getrelativepointvelocity "Direct link to GetRelativePointVelocity") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **GetRelativePointVelocity** ([SVector](/scripting/client-scripting-api-reference/types/svector.md) point) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Rigidbody.GetRelativePointVelocity(Vector.New(1,1,1)) ``` ##### MovePosition[​](#moveposition "Direct link to MovePosition") void **MovePosition** ([SVector](/scripting/client-scripting-api-reference/types/svector.md) point) *Moves the rigidbody to position.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Rigidbody.MovePosition(Vector.New(1,1,1)) ``` * Lua ```lua local obj = Space.Host.ExecutingObject; local moveHere = Vector.New(obj.WorldPosition.x+10,obj.WorldPosition.y,obj.WorldPosition.z); obj.Rigidbody.MovePosition (moveHere); -- The object has been moved by 10 units in the positive X direction ``` ##### MoveRotation[​](#moverotation "Direct link to MoveRotation") void **MoveRotation** ([SQuaternion](/scripting/client-scripting-api-reference/types/squaternion.md) rotation) *Rotates the rigidbody to rotation.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Rigidbody.MoveRotation(Quaternion.New(0,1,0,0)) ``` * Lua ```lua local obj = Space.Host.ExecutingObject; local setRotationTo = Quaternion.Euler(60,0,0) obj.Rigidbody.MoveRotation (setRotationTo); -- The object's rotation has been set to 60 degrees in the positive X direction and 0 in Y and Z ``` ##### ResetCenterOfMass[​](#resetcenterofmass "Direct link to ResetCenterOfMass") void **ResetCenterOfMass** () *Reset the center of mass of the rigidbody.* * Lua ```lua Space.Host.ExecutingObject.Rigidbody.ResetCenterOfMass() ``` * Lua ```lua local obj = Space.Host.ExecutingObject; obj.Rigidbody.CenterOfMass = Vector.New(1,1,1); Space.Log(obj.Rigidbody.CenterOfMass); -- prints "[1,1,1]" to the console obj.Rigidbody.ResetCenterOfMass(); Space.Log(obj.Rigidbody.CenterOfMass); -- prints "[0,0,0]" to the console ``` ##### ResetIntertiaTensor[​](#resetintertiatensor "Direct link to ResetIntertiaTensor") void **ResetIntertiaTensor** () *Reset the inertia tensor value and rotation.* * Lua ```lua Space.Host.ExecutingObject.Rigidbody.ResetIntertiaTensor() ``` * Lua ```lua solid = Space.Scene.Find("Solid") --get rigidbody of inertia frame. rigid = solid.Rigidbody if rigid == nil then rigid = solid.AddRigidbody() end rigid.ResetIntertiaTensor() --to reset inertia tensor if intertia tensor is set ``` ##### Sleep[​](#sleep "Direct link to Sleep") void **Sleep** () *Forces a rigidbody to sleep.* * Lua ```lua Space.Host.ExecutingObject.Rigidbody.Sleep() ``` ##### WakeUp[​](#wakeup "Direct link to WakeUp") void **WakeUp** () *Forces a rigidbody to wake up.* * Lua ```lua Space.Host.ExecutingObject.Rigidbody.WakeUp() ``` ##### SweepTestAll[​](#sweeptestall "Direct link to SweepTestAll") [SPhysicsHit](/scripting/client-scripting-api-reference/types/sphysicshit.md)\[] **SweepTestAll** ([SVector](/scripting/client-scripting-api-reference/types/svector.md) direction, float distance) *Like Rigidbody.SweepTest, but returns all hits.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Rigidbody.SweepTestAll(Vector.New(1,0,0) , 20) ``` * Lua ```lua solid = Space.Scene.Find("Solid") --get rigidbody of inertia frame. rigid = solid.Rigidbody if rigid == nil then rigid = solid.AddRigidbody() end hits = rigid.SweepTestAll(solid.Forward , 20) --sweep forward 20 meters, and return all hits. if hits~=nil and #hits-1 > 0 then for i = 1,#hits-1 do Space.Log(hits[i].Object.Name) end end --output all hit gameobject. ``` #### Properties[​](#properties "Direct link to Properties") ##### AngularDrag[​](#angulardrag "Direct link to AngularDrag") float **AngularDrag** `get` `set` *The angular drag of the object.* * Lua ```lua Space.Host.ExecutingObject.Rigidbody.AngularDrag = 0.20 ``` ##### AngularVelocity[​](#angularvelocity "Direct link to AngularVelocity") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **AngularVelocity** `get` `set` *The angular velocity vector of the rigidbody (in radians per second).* * Lua ```lua Space.Host.ExecutingObject.Rigidbody.AngularVelocity = Vector.New(0,1,0) ``` * Lua ```lua local obj = Space.Host.ExecutingObject; -- Set a new angular velocity vector obj.Rigidbody.AngularVelocity = Vector.New(0,Space.Math.Pi,0); -- Now the object is rotating about the Y axis at a speed of 180 degrees per second -- (or 30 revolutions per minute) -- Get the current angular velocity vector Space.Log(obj.Rigidbody.AngularVelocity); -- prints "[0, 3.141593, 0]" to the console ``` ##### CenterOfMass[​](#centerofmass "Direct link to CenterOfMass") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **CenterOfMass** `get` `set` *The center of mass relative to the local origin.* * Lua ```lua Space.Host.ExecutingObject.Rigidbody.CenterOfMass = Vector.New(1,0,0) ``` ##### Drag[​](#drag "Direct link to Drag") float **Drag** `get` `set` *The drag of the object.* * Lua ```lua Space.Host.ExecutingObject.Rigidbody.Drag = 5 ``` ##### FreezeRotation[​](#freezerotation "Direct link to FreezeRotation") bool **FreezeRotation** `get` `set` *Controls whether physics will have any impact on the rotation of the object.* * Lua ```lua Space.Host.ExecutingObject.Rigidbody.FreezeRotation = true ``` ##### Kinematic[​](#kinematic "Direct link to Kinematic") bool **Kinematic** `get` `set` *Controls whether physics will have any impact on the object.* * Lua ```lua Space.Host.ExecutingObject.Rigidbody.Kinematic = true ``` ##### Mass[​](#mass "Direct link to Mass") float **Mass** `get` `set` *The mass of the rigidbody.* * Lua ```lua Space.Host.ExecutingObject.Rigidbody.Mass = 0.1 ``` ##### MaxAngularVelocity[​](#maxangularvelocity "Direct link to MaxAngularVelocity") float **MaxAngularVelocity** `get` `set` *The maximum angular velocity of the rigidbody (7 by default). Can be useful to prevent an object from spinning uncontrollably fast.* * Lua ```lua Space.Host.ExecutingObject.Rigidbody.MaxAngularVelocity = 1 ``` ##### MaxDepenetrationVelocity[​](#maxdepenetrationvelocity "Direct link to MaxDepenetrationVelocity") float **MaxDepenetrationVelocity** `get` `set` *The maximum depenetration velocity of the rigidbody (1.00000003318135E+32 by default). Can be useful to make colliding objects bounce away in a smoother fashion.* * Lua ```lua Space.Host.ExecutingObject.Rigidbody.MaxDepenetrationVelocity = 1 ``` ##### UseGravity[​](#usegravity "Direct link to UseGravity") bool **UseGravity** `get` `set` *Controls whether gravity affects the rigidbody.* * Lua ```lua Space.Host.ExecutingObject.Rigidbody.UseGravity = true ``` * Lua ```lua local obj = Space.Host.ExecutingObject; -- Set UseGravity to False (it is set to True by default) obj.Rigidbody.UseGravity = false; -- Now gravity does not affect the rigidbody. -- Get the UseGravity value (find out if UseGravity is in action) Space.Log(obj.Rigidbody.UseGravity); -- prints "False" to the console ``` ##### Velocity[​](#velocity "Direct link to Velocity") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **Velocity** `get` `set` *The velocity vector of the rigidbody. (in units per second).* * Lua ```lua Space.Host.ExecutingObject.Rigidbody.Velocity = Vector.New(0,1,0) ``` * Lua ```lua local obj = Space.Host.ExecutingObject; -- Set a new velocity vector obj.Rigidbody.Velocity = Vector.New(0, 0, 1); -- Now the object is moving in the positive Z direction at a speed of 1 unit per second -- Get the current velocity vector Space.Log(obj.Rigidbody.Velocity); -- prints "[0, 0, 1]" to the console ``` ##### WorldCenterOfMass[​](#worldcenterofmass "Direct link to WorldCenterOfMass") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **WorldCenterOfMass** `get` *The center of mass of the rigidbody relative to the global origin (Read Only).* * Lua \`\`\` WorldCenter = Space.Host.ExecutingObject.Rigidbody.WorldCenterOfMass \`\`\` * Lua ```lua local obj = Space.Host.ExecutingObject; -- Get the current center of mass Space.Log(obj.Rigidbody.WorldCenterOfMass); -- prints "[x, y, z]" to the console, where x,y,z are global coordinates of the center of mass. If CenterOfMass == [0,0,0], then x,y,z are equal to the global coordinates of the object. ``` ##### Sleeping[​](#sleeping "Direct link to Sleeping") bool **Sleeping** `get` *Is the rigidbody sleeping?* * Lua ```lua isSleeping = Space.Host.ExecutingObject.Rigidbody.Sleeping ``` * Lua ```lua local obj = Space.Host.ExecutingObject; obj.Rigidbody.Sleep(); Space.Log(obj.Rigidbody.Sleeping); -- prints "True" to the console obj.Rigidbody.WakeUp(); Space.Log(obj.Rigidbody.Sleeping); -- prints "False" to the console ``` ##### Density[​](#density "Direct link to Density") float **Density** `set` *The density of the object (1 by default). Changing this value will affect the mass of the object (the volume will remain unchanged).* * Lua ```lua density = Space.Host.ExecutingObject.Rigidbody.Density ``` * Lua ```lua local obj = Space.Host.ExecutingObject; Space.Log(obj.Rigidbody.Mass); -- prints "1" to the console obj.LocalScale = Vector.New(2,2,2); obj.Rigidbody.Density = 0.5; Space.Log(obj.Rigidbody.Mass); -- prints "4" to the console - the density is 2 times lower, and the object is 8 times bigger, therefore it's 4 times heavier. ``` ##### InertiaTensor[​](#inertiatensor "Direct link to InertiaTensor") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **InertiaTensor** `get` `set` *The diagonal inertia tensor of mass relative to the center of mass. It is defined in x,y,z axis. It is calculate by physics automatically,and if you set value to it, it would override the value.* * Lua ```lua Space.Host.ExecutingObject.Rigidbody.IntertiaTensor = Vector.New(0,0,0) ``` * Lua ```lua solid = Space.Scene.Find("Solid") --get rigidbody of inertia frame. rigid = solid.Rigidbody if rigid == nil then rigid = solid.AddRigidbody() end rigid.InertiaTensor = Vector.New(10,100,1) rigid.AddTorque(Vector.New(100,100,100)) --set inertia tensor to 10,100,1, and add torque 100 to all axis,and rotate velocity x:y:z would be 10:1:100. ``` ##### InertiaTensorRotation[​](#inertiatensorrotation "Direct link to InertiaTensorRotation") [SQuaternion](/scripting/client-scripting-api-reference/types/squaternion.md) **InertiaTensorRotation** `get` `set` *The rotation of the inertia tensor.* * Lua ```lua Space.Host.ExecutingObject.Rigidbody.InertiaTensorRotation = Quaternion.New(0,0,0,0) ``` * Lua ```lua solid = Space.Scene.Find("Solid") --get rigidbody of inertia frame. rigid = solid.Rigidbody if rigid == nil then rigid = solid.AddRigidbody() end rigid.InertiaTensor = Vector.New(10,100,1) rigid.InertiaTensorRotation = Quaternion.Euler(0,90,0) rigid.AddTorque(Vector.New(100,100,100)) --set inertia tensor manually and rotate this inertia tensor by 90 degrees in y axis. ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua ```lua theGameObject = Space.Host.ExecutingObject.Rigidbody.GameObject ``` --- ### SRoomFloor #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ------------------------------------------------------------------------------------------------------------------ | | bool [**Enabled** ](/scripting/client-scripting-api-reference/components/sroomfloor.md#enabled)`get` `set` | | string [**Name** ](/scripting/client-scripting-api-reference/components/sroomfloor.md#name)`get` | | string [**Description** ](/scripting/client-scripting-api-reference/components/sroomfloor.md#description)`get` | | bool [**IsDefaultFloor** ](/scripting/client-scripting-api-reference/components/sroomfloor.md#isdefaultfloor)`get` | | SGameObject\[] [**Furniture** ](/scripting/client-scripting-api-reference/components/sroomfloor.md#furniture)`get` | | int [**Owner** ](/scripting/client-scripting-api-reference/components/sroomfloor.md#owner)`get` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/sroomfloor.md#gameobject)`get` | #### Properties[​](#properties "Direct link to Properties") ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` *Status of enable or disable room floor component* * Lua ```lua Space.Host.ExecutingObject.Floor.Enabled = false ``` ##### Name[​](#name "Direct link to Name") string **Name** `get` *Name of this floor* * Lua ```lua Space.Host.ExecutingObject.Floor.Name ``` ##### Description[​](#description "Direct link to Description") string **Description** `get` *Description of this floor.* * Lua ```lua floorDescription = Space.Host.ExecutingObject.Floor.Description ``` ##### IsDefaultFloor[​](#isdefaultfloor "Direct link to IsDefaultFloor") bool **IsDefaultFloor** `get` *Is this default floor?* * Lua ```lua isDefault = Space.Host.ExecutingObject.Floor.IsDefaultFloor ``` ##### Furniture[​](#furniture "Direct link to Furniture") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md)\[] **Furniture** `get` *Get all furniture game objects* * Lua ```lua furnitureInFloor = Space.Host.ExecutingObject.Floor.Furniture ``` ##### Owner[​](#owner "Direct link to Owner") int **Owner** `get` *Return the ID of the user account that owns this room floor, if any.* * Lua ```lua ownerID = Space.Host.ExecutingObject.Floor.Owner ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua ```lua theGameObject = Space.Host.ExecutingObject.Floor.GameObject ``` --- ### SSceneBackgroundMusic #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | void [**Play** ](/scripting/client-scripting-api-reference/components/sscenebackgroundmusic.md#play)() | | void [**PlayMP3Stream** ](/scripting/client-scripting-api-reference/components/sscenebackgroundmusic.md#playmp3stream)(string url) | | void [**PlayVorbisStream** ](/scripting/client-scripting-api-reference/components/sscenebackgroundmusic.md#playvorbisstream)(string url) | | void [**Stop** ](/scripting/client-scripting-api-reference/components/sscenebackgroundmusic.md#stop)() | | void [**OnTrackChange** ](sscenebackgroundmusic#ontrackchange)(Closure o)
void [**OnTrackChange** ](sscenebackgroundmusic#ontrackchange)(Action< STrackInfo > trackInfoCallback) | | void [**OnUpcomingTrackChange** ](sscenebackgroundmusic#onupcomingtrackchange)(Closure o)
void [**OnUpcomingTrackChange** ](sscenebackgroundmusic#onupcomingtrackchange)(Action< STrackInfo > trackInfoCallback) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ---------------------------------------------------------------------------------------------------------------------------- | | bool [**Enabled** ](/scripting/client-scripting-api-reference/components/sscenebackgroundmusic.md#enabled)`get` `set` | | string [**URL** ](/scripting/client-scripting-api-reference/components/sscenebackgroundmusic.md#url)`get` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/sscenebackgroundmusic.md#gameobject)`get` | #### Functions[​](#functions "Direct link to Functions") ##### Play[​](#play "Direct link to Play") void **Play** () *Plays the radio stream* * Lua ```lua Space.Host.ExecutingObject.Radio.Play() ``` * Lua ```lua --this script will let us click a radio to make it start playing --(Example: clicking a light switch toggle's a parent light bulb's intensity) --[Requires a "Shoutcast Streaming" component on the parent of this object] thisGameObject = Space.Host.ExecutingObject IsPlaying = false StartPlaying = function() thisGameObject.Radio.Play() IsPlaying = true end StopPlaying = function() thisGameObject.Radio.Stop() IsPlaying = false end OnClick = function() if IsPlaying then StopPlaying() else StartPlaying() end end thisGameObject.AddClickable() thisGameObject.Clickable.Tooltip="Toggle Play/Stop" thisGameObject.Clickable.OnClick(OnClick) ``` ##### PlayMP3Stream[​](#playmp3stream "Direct link to PlayMP3Stream") void **PlayMP3Stream** (string url) *Sets the given MP3 stream url as current stream* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Radio.PlayMP3Stream("http://stream.example.org:1234/") ``` ##### PlayVorbisStream[​](#playvorbisstream "Direct link to PlayVorbisStream") void **PlayVorbisStream** (string url) *Sets the given Vorbis stream url as current stream* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Radio.PlayVorbisStream("http://stream.example.org:1234/") ``` ##### Stop[​](#stop "Direct link to Stop") void **Stop** () *Stops playing the radio stream* * Lua ```lua Space.Host.ExecutingObject.Radio.Stop() ``` * Lua ```lua --this script will let us click a radio to make it start playing --(Example: clicking a light switch toggle's a parent light bulb's intensity) --[Requires a "Shoutcast Streaming" component on the parent of this object] thisGameObject = Space.Host.ExecutingObject IsPlaying = false StartPlaying = function() thisGameObject.Radio.Play() IsPlaying = true end StopPlaying = function() thisGameObject.Radio.Stop() IsPlaying = false end OnClick = function() if IsPlaying then StopPlaying() else StartPlaying() end end thisGameObject.AddClickable() thisGameObject.Clickable.Tooltip="Toggle Play/Stop" thisGameObject.Clickable.OnClick(OnClick) ``` ##### OnTrackChange[​](#ontrackchange "Direct link to OnTrackChange") void **OnTrackChange** (Closure o)
void **OnTrackChange** (Action<[ STrackInfo](/scripting/client-scripting-api-reference/types/strackinfo.md) > trackInfoCallback) *Function will be called when track changes.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua otc = function(trackInfo) end Space.Host.ExecutingObject.Radio.OnTrackChange(otc) ``` * Lua ```lua --this script will update a UIText object with the track title on track change --[this GameObject needs a "Shoutcast Streaming"/"SceneBackgroundMusic" component] thisObj = Space.Host.ExecutingObject text = Space.Host.GetReference("Text") -- set in Scripting Runtime references otc = function(trackInfo) text.UIText.Text = "Track: " .. trackInfo.Title .. " by " .. trackInfo.Artist end thisObj.Radio.OnTrackChange(otc) ``` ##### OnUpcomingTrackChange[​](#onupcomingtrackchange "Direct link to OnUpcomingTrackChange") void **OnUpcomingTrackChange** (Closure o)
void **OnUpcomingTrackChange** (Action< [STrackInfo](/scripting/client-scripting-api-reference/types/strackinfo.md) > trackInfoCallback) *Function will be called when there's an upcoming track change* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua otc = function(trackInfo) end Space.Host.ExecutingObject.Radio.OnUpcomingTrackChange(otc) ``` * Lua ```lua --this script will update a UIText object with the track title on upcoming track change --[this GameObject needs a "Shoutcast Streaming"/"SceneBackgroundMusic" component] thisObj = Space.Host.ExecutingObject text = Space.Host.GetReference("Text") -- set in Scripting Runtime references outc = function(upcomingTrackInfo) text.UIText.Text = "Track: " .. upcomingTrackInfo.Title .. " by " .. upcomingTrackInfo.Artist end thisObj.Radio.OnUpcomingTrackChange(outc) ``` #### Properties[​](#properties "Direct link to Properties") ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` *Is this component Enabled?* * Lua ```lua Space.Host.ExecutingObject.Radio.Enabled = true ``` * Lua ```lua --clicking this object will Enable/Disable it's Scene Background Music component thisGameObject = Space.Host.ExecutingObject component = thisGameObject.Radio OnClick = function() component.Enabled = not component.Enabled end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### URL[​](#url "Direct link to URL") string **URL** `get` *URL of the current stream* * Lua ```lua streamURL = Space.Host.ExecutingObject.Radio.URL ``` * Lua ```lua --this script will update a UIText object with the current stream URL --[this GameObject needs a "Shoutcast Streaming"/"SceneBackgroundMusic" component] thisObj = Space.Host.ExecutingObject text = Space.Host.GetReference("Text") -- set in Scripting Runtime references OnUpdate = function() text.UIText.Text = thisObj.Radio.URL end thisObj.OnUpdate(OnUpdate) ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua ```lua theGameObject = Space.Host.ExecutingObject.Floor.GameObject ``` --- ### SScriptingData #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | object [**GetVariable** ](/scripting/client-scripting-api-reference/components/sscriptingdata.md#getvariable)(string name) | | void [**SetVariable** ](/scripting/client-scripting-api-reference/components/sscriptingdata.md#setvariable)(string name, DynValue property, bool persistent=false) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ---------------------------------------------------------------------------------------------------------------------- | | bool [**Enabled** ](/scripting/client-scripting-api-reference/components/sscriptingdata.md#enabled)`get` `set` | | string\[] [**Variables** ](/scripting/client-scripting-api-reference/components/sscriptingdata.md#variables)`get` | | string [**ComponentName**](/scripting/client-scripting-api-reference/components/sscriptingdata.md#componentname) `get` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/sscriptingdata.md#gameobject)`get` | #### Functions[​](#functions "Direct link to Functions") ##### GetVariable[​](#getvariable "Direct link to GetVariable") object **GetVariable** (string name) *Return the object of the variable.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Data.GetVariable("variableName") ``` ##### SetVariable[​](#setvariable "Direct link to SetVariable") void **SetVariable** (string name, DynValue property, bool persistent=false) *Set properties to variable.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.SetVariable("variableName",5,true) ``` #### Properties[​](#properties "Direct link to Properties") ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` *Is the ScriptingData component Enabled?* * Lua ```lua Space.Host.ExecutingObject.Data.Enabled = false ``` * Lua ```lua --clicking this object will Enable/Disable it's Scripting Data component thisGameObject = Space.Host.ExecutingObject component = thisGameObject.Data OnClick = function() component.Enabled = not component.Enabled end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### Variables[​](#variables "Direct link to Variables") string\[] **Variables** `get` *Property Description* * Lua ```lua variableNames = Space.Host.ExecutingObject.Data.Variables ``` ##### ComponentName[​](#componentname "Direct link to ComponentName") string **ComponentName** `get` *The name of this component.* * Lua ```lua componentName = Space.Host.ExecutingObject.Data.ComponentName ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua ```lua theGameObject = Space.Host.ExecutingObject.Data.GameObject ``` --- ### SScriptingEvents #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | -------------------------------------------------------------------------------------------------------------------------- | | void [**InvokeEvent** ](/scripting/client-scripting-api-reference/components/sscriptingevents.md#invokeevent)(string name) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ------------------------------------------------------------------------------------------------------------------------ | | bool [**Enabled** ](/scripting/client-scripting-api-reference/components/sscriptingevents.md#enabled)`get` `set` | | string\[] [**Events** ](/scripting/client-scripting-api-reference/components/sscriptingevents.md#events)`get` | | string [**ComponentName**](/scripting/client-scripting-api-reference/components/sscriptingevents.md#componentname) `get` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/sscriptingevents.md#gameobject)`get` | #### Functions[​](#functions "Direct link to Functions") ##### InvokeEvent[​](#invokeevent "Direct link to InvokeEvent") void **InvokeEvent** (string name) *Invoke the event with its name* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Events.InvokeEvent("EventName") ``` #### Properties[​](#properties "Direct link to Properties") ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` *Whether the scriptingEvents component is enabled or not* * Lua ```lua Space.Host.ExecutingObject.Events.Enabled = true ``` ##### Events[​](#events "Direct link to Events") string\[] **Events** `get` *Returns a list of events* * Lua ```lua eventNames = Space.Host.ExecutingObject.Events.Events ``` ##### ComponentName[​](#componentname "Direct link to ComponentName") string **ComponentName** `get` *The name of this component.* * Lua ```lua componentName = Space.Host.ExecutingObject.Events.ComponentName ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua ```lua theGameObject = Space.Host.ExecutingObject.Events.GameObject ``` --- ### SScriptingResources #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | ---------------------------------------------------------------------------------------------------------------------------------- | | SResource [**GetResource** ](/scripting/client-scripting-api-reference/components/sscriptingresources.md#getresource)(string name) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | -------------------------------------------------------------------------------------------------------------------------- | | bool [**Enabled** ](/scripting/client-scripting-api-reference/components/sscriptingresources.md#enabled)`get` `set` | | SResource\[] [**Resources** ](/scripting/client-scripting-api-reference/components/sscriptingresources.md#resources)`get` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/sscriptingresources.md#gameobject)`get` | #### Functions[​](#functions "Direct link to Functions") ##### GetResource[​](#getresource "Direct link to GetResource") [SResource](/scripting/client-scripting-api-reference/types/sresource.md) **GetResource** (string name) *Returns the SResource with the specified name, or else returns nil if not found.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua resource = Space.Host.ExecutingObject.Resources.GetResource("ResourceName") ``` * Lua ```lua local thisObject=Space.Host.ExecutingObject local thisObjectResource=thisObject.Resources.GetResource("Test") if thisObjectResource == nil then Space.Log("That resource was not found.") else Space.Log("That resource exists and can be used.") end ``` #### Properties[​](#properties "Direct link to Properties") ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` *Return whether the ScriptingResources component is Enabled or not* * Lua ```lua Space.Host.ExecutingObject.Resources.Enabled = true ``` ##### Resources[​](#resources "Direct link to Resources") SResource\[] **Resources** `get` *Returns an array of all resources contained within this component.* * Lua ```lua arrayOfResources = Space.Host.ExecutingObject.Resources.Resources ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua ```lua theGameObject = Space.Host.ExecutingObject.Resources.GameObject ``` --- ### SScriptingRuntime #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | SResource [**GetResource** ](/scripting/client-scripting-api-reference/components/sscriptingruntime.md#getresource)(string name) | | void [**CallScriptFunction** ](sscriptingruntime#callscriptfunction)(string name, params DynValue\[] arguments)
void [**CallScriptFunction** ](sscriptingruntime#callscriptfunction)(string name) | | void [**Reset** ](/scripting/client-scripting-api-reference/components/sscriptingruntime.md#reset)() | | object [**GetPublicVariable** ](/scripting/client-scripting-api-reference/components/sscriptingruntime.md#getpublicvariable)(string name) | | void [**SetPublicVariable** ](/scripting/client-scripting-api-reference/components/sscriptingruntime.md#setpublicvariable)(string name, DynValue property, bool persistent=false) | | void [**InvokeEvent** ](/scripting/client-scripting-api-reference/components/sscriptingruntime.md#invokeevent)(string name) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ------------------------------------------------------------------------------------------------------------------------- | | SResource\[] [**Resources** ](/scripting/client-scripting-api-reference/components/sscriptingruntime.md#resources)`get` | | bool [**Enabled** ](/scripting/client-scripting-api-reference/components/sscriptingruntime.md#enabled)`get` `set` | | string [**ComponentName**](/scripting/client-scripting-api-reference/components/sscriptingruntime.md#componentname) `get` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/sscriptingruntime.md#gameobject)`get` | #### Functions[​](#functions "Direct link to Functions") ##### GetResource[​](#getresource "Direct link to GetResource") [SResource](/scripting/client-scripting-api-reference/types/sresource.md) **GetResource** (string name) *Get the resource by its name and return it.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua resource = Space.Host.ExecutingObject.Script.GetResource("resource name") ``` ##### CallScriptFunction[​](#callscriptfunction "Direct link to CallScriptFunction") void **CallScriptFunction** (string name, params DynValue\[] arguments)
void **CallScriptFunction** (string name) *Call registered script function with specified arguments.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua resource = Space.Host.ExecutingObject.Script.CallScriptFunction("FunctionName") --or resource = Space.Host.ExecutingObject.Script.CallScriptFunction("FunctionName", tableWithArguments) ``` ##### Reset[​](#reset "Direct link to Reset") void **Reset** () *Reset event members to their initial values.* * Lua ```lua Space.Host.ExecutingObject.Script.Reset() ``` ##### GetPublicVariable[​](#getpublicvariable "Direct link to GetPublicVariable") object **GetPublicVariable** (string name) *Gets the public variable by its name and return it.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua publicVariable = Space.Host.ExecutingObject.Script.GetPublicVariable("variableName") ``` ##### SetPublicVariable[​](#setpublicvariable "Direct link to SetPublicVariable") void **SetPublicVariable** (string name, DynValue property, bool persistent=false) *Set the property to public variable with name "name".* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Script.SetPublicVariable("VariableName",5,true) ``` ##### InvokeEvent[​](#invokeevent "Direct link to InvokeEvent") void **InvokeEvent** (string name) *Invokes the event with the name "name".* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Script.InvokeEvent("EventName") ``` #### Properties[​](#properties "Direct link to Properties") ##### Resources[​](#resources "Direct link to Resources") [SResource](/scripting/client-scripting-api-reference/types/sresource.md)\[] **Resources** `get` *Return a list of resource.* * Lua ```lua tableResources = Space.Host.ExecutingObject.Script.Resources ``` ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` *Whether the scripting runtime component is Enabled.* * Lua ```lua Space.Host.ExecutingObject.Script.Enabled = true ``` ##### ComponentName[​](#componentname "Direct link to ComponentName") string **ComponentName** `get` *The name of this component.* * Lua ```lua componentName = Space.Host.ExecutingObject.Script.ComponentName ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua ```lua theGameObject = Space.Host.ExecutingObject.Script.GameObject ``` --- ### SSeat #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | --------------------------------------------------------------------------------------------------------------------- | | void [**SitPlayer** ](/scripting/client-scripting-api-reference/components/sseat.md#sitplayer)() | | void [**UnseatPlayer** ](/scripting/client-scripting-api-reference/components/sseat.md#unseatplayer)() | | void [**OnStandUp** ](/scripting/client-scripting-api-reference/components/sseat.md#onstandup)(Closure e) | | void [**OnSit** ](/scripting/client-scripting-api-reference/components/sseat.md#onsit)(Closure e) | | void [**OnPlayerStandUp** ](/scripting/client-scripting-api-reference/components/sseat.md#onplayerstandup)(Closure e) | | void [**OnPlayerSit** ](/scripting/client-scripting-api-reference/components/sseat.md#onplayersit)(Closure e) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ------------------------------------------------------------------------------------------------------------------------------ | | bool [**Enabled** ](/scripting/client-scripting-api-reference/components/sseat.md#enabled)`get` `set` | | bool [**InUse** ](/scripting/client-scripting-api-reference/components/sseat.md#inuse)`get` | | long [**PlayerSeated** ](/scripting/client-scripting-api-reference/components/sseat.md#playerseated)`get` | | bool [**UseSlotID** ](/scripting/client-scripting-api-reference/components/sseat.md#useslotid)`get` `set` | | string [**SlotID** ](/scripting/client-scripting-api-reference/components/sseat.md#slotid)`get` `set` | | SCollider [**ClickableCollider** ](/scripting/client-scripting-api-reference/components/sseat.md#clickablecollider)`get` `set` | | SResource [**Animation** ](/scripting/client-scripting-api-reference/components/sseat.md#animation)`get` `set` | | SResource [**AnimationMale** ](/scripting/client-scripting-api-reference/components/sseat.md#animationmale)`get` `set` | | SResource [**AnimationFemale** ](/scripting/client-scripting-api-reference/components/sseat.md#animationfemale)`get` `set` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/sseat.md#gameobject)`get` | #### Functions[​](#functions "Direct link to Functions") ##### SitPlayer[​](#sitplayer "Direct link to SitPlayer") void **SitPlayer** () *Make a player sit.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Seat.SitPlayer() ``` ##### UnseatPlayer[​](#unseatplayer "Direct link to UnseatPlayer") void **UnseatPlayer** () *Make a player unseat.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Seat.UnseatPlayer() ``` ##### OnStandUp[​](#onstandup "Direct link to OnStandUp") void **OnStandUp** (Closure e) *Binds a function to the Seat's On Stand Up event* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua e = function() Space.Log("On Stand Up event") end Space.Host.ExecutingObject.Seat.OnStandUp(e) ``` ##### OnSit[​](#onsit "Direct link to OnSit") void **OnSit** (Closure e) *Binds a function to the Seat's On Sit event* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua e = function() Space.Log("On Sit event") end Space.Host.ExecutingObject.Seat.OnSit(e) ``` ##### OnPlayerStandUp[​](#onplayerstandup "Direct link to OnPlayerStandUp") void **OnPlayerStandUp** (Closure e) *Binds a function to the Seat's On Player Stand Up event which is fired only on the Player's client* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua e = function() Space.Log("On Player Stand Up") end Space.Host.ExecutingObject.Seat.OnPlayerStandUp(e) ``` * Lua ```lua --the below script will teleport the player above the seat after standing up --so that they do not go back to original position, but rather be standing next to the seat --(Example: if the seat moves - such as in a vehicle- and we want to stand up next to it) --[Requires Seat Component in the GameObject running this script] thisGameObject = Space.Host.ExecutingObject OnPlayerStandUp = function() seatPosition = thisGameObject.WorldPosition teleportPosition = Vector.New(seatPosition.X, seatPosition.Y + 1, seatPosition.Z) Space.Scene.PlayerAvatar.Teleport(teleportPosition) end thisGameObject.Seat.OnPlayerStandUp(OnPlayerStandUp) ``` ##### OnPlayerSit[​](#onplayersit "Direct link to OnPlayerSit") void **OnPlayerSit** (Closure e) *Binds a function to the Seat's On Player Sit event which is fired only on the Player's client* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua e = function() Space.Log("On Player Sit event") end Space.Host.ExecutingObject.Seat.OnPlayerSit(e) ``` * Lua ```lua --the below script will check if the player sitting is the owner of the seat --if they are not, we will remove them from the seat --(Example: if the seat is a vehicle which the owner wants no one else to use) --[Requires Seat Component in the GameObject running this script] -- thisGameObject = Space.Host.ExecutingObject OnPlayerSit = function() if Space.Scene.PlayerAvatar.ID ~= thisGameObject.Owner then thisGameObject.Seat.UnseatPlayer() Space.Log("You do not have permission to sit in this vehicle") end end thisGameObject.Seat.OnPlayerSit(OnPlayerSit) ``` #### Properties[​](#properties "Direct link to Properties") ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` *Whether the seat component is enabled.* * Lua ```lua = seatIsEnabled = Space.Host.ExecutingObject.Seat.Enabled ``` * Lua ```lua --clicking this object will Enable/Disable it's Seat component thisGameObject = Space.Host.ExecutingObject component = thisGameObject.Seat OnClick = function() component.Enabled = not component.Enabled end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### InUse[​](#inuse "Direct link to InUse") bool **InUse** `get` *Return that whether the seat is in use.* * Lua ```lua seatIsInUse = Space.Host.ExecutingObject.Seat.InUse ``` * Lua ```lua --this script will play a looping sound only if someone is using the seat --and will stop the sound if someone is not --(Example: carnival game ) --[Object must contain a Seat component and AudioSource component] thisGameObject = Space.Host.ExecutingObject OnUpdate = function() if thisGameObject.Seat.InUse then if not thisGameObject.Audio.IsPlaying then thisGameObject.Audio.Play() end else if thisGameObject.Audio.IsPlaying then thisGameObject.Audio.Stop() end end end thisGameObject.Audio.Loop = true thisGameObject.SubscribeToEvents() thisGameObject.OnUpdate(OnUpdate) ``` ##### PlayerSeated[​](#playerseated "Direct link to PlayerSeated") long **PlayerSeated** `get` *Return the ID of the seating player.* * Lua ```lua player = Space.Host.ExecutingObject.Seat.PlayerSeated ``` ##### UseSlotID[​](#useslotid "Direct link to UseSlotID") bool **UseSlotID** `get` `set` *Return true if uses SlotID* * Lua ```lua Space.Host.ExecutingObject.Seat.UseSlotID = false ``` ##### SlotID[​](#slotid "Direct link to SlotID") string **SlotID** `get` `set` *Return the slot ID of the seat.* * Lua ```lua seatSlotID = Space.Host.ExecutingObject.Seat.SlotID ``` ##### ClickableCollider[​](#clickablecollider "Direct link to ClickableCollider") [SCollider](/scripting/client-scripting-api-reference/components/scollider.md) **ClickableCollider** `get` `set` *Return the clickable collider.* * Lua ```lua seatClickableCollider = Space.Host.ExecutingObject.Seat.ClickableCollider ``` ##### Animation[​](#animation "Direct link to Animation") [SResource](/scripting/client-scripting-api-reference/types/sresource.md) **Animation** `get` `set` *Return the animation clip.* * Lua ```lua Space.Host.ExecutingObject.Seat.Animation = Space.GetResource("ResourceName") ``` * Lua ```lua --the below script will toggle between two seat animations every 30 seconds --(Example: a couch where the player sitting periodically changes pose) --[Requires Seat Component in the GameObject running this script] --[Requires adding 2 animations as "Resources" at the bottom of the Scripting Runtime Component] thisGameObject = Space.Host.ExecutingObject anim1 = Space.GetResource("anim1") anim2 = Space.GetResource("anim2") thisGameObject.Seat.Animation = anim1 animIndex = 1 AnimationAlternate = function() while true do Space.Log(thisGameObject.Seat.Animation) if animIndex == 1 then thisGameObject.Seat.Animation = anim2 animIndex = 2 else thisGameObject.Seat.Animation = anim1 animIndex = 1 end -- next part unseats then seats the player to reflect animation change (its too fast to notice) -- we also make sure we are running this part on the specific player sitting (if any), not everyone else if thisGameObject.Seat.InUse then if thisGameObject.Seat.PlayerSeated == Space.Scene.PlayerAvatar.ID then thisGameObject.Seat.UnseatPlayer() thisGameObject.Seat.SitPlayer() end end Space.Log("yielding") coroutine.yield(5) end end Space.Host.StartCoroutine(AnimationAlternate) ``` ##### AnimationMale[​](#animationmale "Direct link to AnimationMale") [SResource](/scripting/client-scripting-api-reference/types/sresource.md) **AnimationMale** `get` `set` *No Description* * Lua ```lua Space.Host.ExecutingObject.Seat.AnimationMale = Space.GetResource("ResourceName") ``` ##### AnimationFemale[​](#animationfemale "Direct link to AnimationFemale") [SResource](/scripting/client-scripting-api-reference/types/sresource.md) **AnimationFemale** `get` `set` *No Description* * Lua ```lua Space.Host.ExecutingObject.Seat.AnimationFemale = Space.GetResource("ResourceName") ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua ```lua theGameObject = Space.Host.ExecutingObject.Seat.GameObject ``` --- ### SSkinnedMeshRenderer #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | --------------------------------------------------------------------------------------------------------------------------------------------------------- | | float [**GetBlendShapeWeight** ](/scripting/client-scripting-api-reference/components/sskinnedmeshrenderer.md#getblendshapeweight)(int index) | | void [**SetBlendShapeWeight** ](/scripting/client-scripting-api-reference/components/sskinnedmeshrenderer.md#setblendshapeweight)(int index, float value) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | -------------------------------------------------------------------------------------------------------------------------------------------- | | SResource [**Mesh** ](/scripting/client-scripting-api-reference/components/sskinnedmeshrenderer.md#mesh)`get` `set` | | bool [**IsVisible** ](/scripting/client-scripting-api-reference/components/sskinnedmeshrenderer.md#isvisible)`get` | | bool [**Enabled** ](/scripting/client-scripting-api-reference/components/sskinnedmeshrenderer.md#enabled)`get` `set` | | SMaterial [**Material** ](/scripting/client-scripting-api-reference/components/sskinnedmeshrenderer.md#material)`get` `set` | | SMaterial [**SharedMaterial** ](/scripting/client-scripting-api-reference/components/sskinnedmeshrenderer.md#sharedmaterial)`get` `set` | | SMaterial\[] [**Materials** ](/scripting/client-scripting-api-reference/components/sskinnedmeshrenderer.md#materials)`get` `set` | | SMaterial\[] [**SharedMaterials** ](/scripting/client-scripting-api-reference/components/sskinnedmeshrenderer.md#sharedmaterials)`get` `set` | | SVector [**BoundsMax** ](/scripting/client-scripting-api-reference/components/sskinnedmeshrenderer.md#boundsmax)`get` | | SVector [**BoundsMin** ](/scripting/client-scripting-api-reference/components/sskinnedmeshrenderer.md#boundsmin)`get` | #### Functions[​](#functions "Direct link to Functions") ##### GetBlendShapeWeight[​](#getblendshapeweight "Direct link to GetBlendShapeWeight") float **GetBlendShapeWeight** (int index) *Return the value of BlendShapeWeight.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.SkinnedMeshRenderer.GetBlendShapeWeight(0) ``` ##### SetBlendShapeWeight[​](#setblendshapeweight "Direct link to SetBlendShapeWeight") void **SetBlendShapeWeight** (int index, float value) *Set the value to the BlendShapeWeight.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.SkinnedMeshRenderer.SetBlendShapeWeight(0) ``` #### Properties[​](#properties "Direct link to Properties") ##### Mesh[​](#mesh "Direct link to Mesh") [SResource](/scripting/client-scripting-api-reference/types/sresource.md) **Mesh** `get` `set` *Return the mesh.* * Lua ```lua Space.Host.ExecutingObject.SkinnedMeshRenderer.Mesh = Space.GetResource("resourceName") ``` ##### IsVisible[​](#isvisible "Direct link to IsVisible") bool **IsVisible** `get` *Property Description* * Lua ```lua isVisible = Space.Host.ExecutingObject.SkinnedMeshRenderer.IsVisible ``` ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` *To check if the SkinnedMeshRenderer component is Enabled or not.* * Lua ```lua Space.Host.ExecutingObject.SkinnedMeshRenderer.Enabled = true ``` * Lua ```lua --clicking this object will Enable/Disable an object's SkinnedMeshRenderer component --[Add "skinnedmeshrenderer" reference to scripting runtime component] thisGameObject = Space.Host.ExecutingObject skinnedmeshrenderer = Space.Host.GetReference("skinnedmeshrenderer").SkinnedMeshRenderer OnClick = function() skinnedmeshrenderer.Enabled = not skinnedmeshrenderer.Enabled end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### Material[​](#material "Direct link to Material") [SMaterial](/scripting/client-scripting-api-reference/types/smaterial.md) **Material** `get` `set` *Property Description* * Lua ```lua Space.Host.ExecutingObject.SkinnedMeshRenderer.Material = Space.GetResource("ResourceName").AsMaterial ``` ##### SharedMaterial[​](#sharedmaterial "Direct link to SharedMaterial") [SMaterial](/scripting/client-scripting-api-reference/types/smaterial.md) **SharedMaterial** `get` `set` *Property Description* * Lua ```lua Space.Host.ExecutingObject.SkinnedMeshRenderer.SharedMaterial = Space.GetResource("ResourceName").AsMaterial ``` ##### Materials[​](#materials "Direct link to Materials") [SMaterial](/scripting/client-scripting-api-reference/types/smaterial.md)\[] **Materials** `get` `set` *Property Description* * Lua ```lua Space.Host.ExecutingObject.SkinnedMeshRenderer.Materials = {Space.GetResource("1stResourceName").AsMaterial, Space.GetResource("2ndResourceName").AsMaterial} ``` ##### SharedMaterials[​](#sharedmaterials "Direct link to SharedMaterials") [SMaterial](/scripting/client-scripting-api-reference/types/smaterial.md)\[] **SharedMaterials** `get` `set` *Property Description* * Lua ```lua Space.Host.ExecutingObject.SkinnedMeshRenderer.SharedMaterials = {Space.GetResource("1stResourceName").AsMaterial, Space.GetResource("2ndResourceName").AsMaterial} ``` ##### BoundsMax[​](#boundsmax "Direct link to BoundsMax") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **BoundsMax** `get` *Property Description* * Lua ```lua vectorBoundsMax = Space.Host.ExecutingObject.SkinnedMeshRenderer.BoundsMax ``` ##### BoundsMin[​](#boundsmin "Direct link to BoundsMin") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **BoundsMin** `get` *Property Description* * Lua ```lua vectorBoundsMin = Space.Host.ExecutingObject.SkinnedMeshRenderer.BoundsMin ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua ```lua theGameObject = Space.Host.ExecutingObject.SkinnedMeshRenderer.GameObject ``` --- ### SSphereCollider #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ---------------------------------------------------------------------------------------------------------------------- | | SVector [**Center** ](/scripting/client-scripting-api-reference/components/sspherecollider.md#center)`get` `set` | | float [**Radius** ](/scripting/client-scripting-api-reference/components/sspherecollider.md#radius)`get` `set` | | bool [**Enabled** ](/scripting/client-scripting-api-reference/components/sspherecollider.md#enabled)`get` `set` | | bool [**IsTrigger** ](/scripting/client-scripting-api-reference/components/sspherecollider.md#istrigger)`get` `set` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/sspherecollider.md#gameobject)`get` | #### Properties[​](#properties "Direct link to Properties") ##### Center[​](#center "Direct link to Center") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **Center** `get` `set` *The center of the sphere in the object's local space.* * Lua ```lua Center = Space.Host.ExecutingObject.SphereCollider.Center ``` * Lua ```lua --clicking this object moves it's Sphere Collider's center one unit upwards thisObject = Space.Host.ExecutingObject OnClick = function() center = thisObject.SphereCollider.Center thisObject.SphereCollider.Center = Vector.New(center.X,center.Y + 1, center.Z) end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### Radius[​](#radius "Direct link to Radius") float **Radius** `get` `set` *The radius of the sphere measured in the object's local space.* * Lua ```lua Space.Host.ExecutingObject.SphereCollider.Radius = 2 ``` * Lua ```lua --clicking this object increments it's Sphere Collider's radius by one unit thisObject = Space.Host.ExecutingObject OnClick = function() thisObject.SphereCollider.Radius = thisObject.SphereCollider.Radius + 1 end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` *Enabled Colliders will collide with other Colliders, disabled Colliders won't.* * Lua ```lua Space.Host.ExecutingObject.SphereCollider.Enabled = false ``` * Lua ```lua --clicking this object toggles it's Sphere Collider On/Off thisObject = Space.Host.ExecutingObject OnClick = function() thisObject.SphereCollider.Enabled = not thisObject.SphereCollider.Enabled end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### IsTrigger[​](#istrigger "Direct link to IsTrigger") bool **IsTrigger** `get` `set` *Is the collider a trigger?* * Lua ```lua Space.Host.ExecutingObject.SphereCollider.Enabled = true ``` * Lua ```lua --clicking this object toggles it's Sphere Collider between being a Collider vs Trigger Collider thisObject = Space.Host.ExecutingObject OnClick = function() thisObject.SphereCollider.IsTrigger = not thisObject.SphereCollider.IsTrigger end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua ```lua theGameObject = Space.Host.ExecutingObject.SphereCollider.GameObject ``` --- ### SStateMachine #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | ----------------------------------------------------------------------------------------------------------------------- | | void [**NextState** ](/scripting/client-scripting-api-reference/components/sstatemachine.md#nextstate)() | | void [**PrevState** ](/scripting/client-scripting-api-reference/components/sstatemachine.md#prevstate)() | | void [**SetState** ](sstatemachine#setstate)(int state)
void [**SetState** ](sstatemachine#setstate)(string state) | | void [**BindToUI** ](sstatemachine#bindtoui)()
void [**BindToUI** ](sstatemachine#bindtoui)(SGameObject go) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | --------------------------------------------------------------------------------------------------------------------------- | | bool [**Enabled** ](/scripting/client-scripting-api-reference/components/sstatemachine.md#enabled)`get` `set` | | int [**StateCount** ](/scripting/client-scripting-api-reference/components/sstatemachine.md#statecount)`get` | | string\[] [**StateNames** ](/scripting/client-scripting-api-reference/components/sstatemachine.md#statenames)`get` | | int [**CurrentState** ](/scripting/client-scripting-api-reference/components/sstatemachine.md#currentstate)`get` | | string [**CurrentStateName** ](/scripting/client-scripting-api-reference/components/sstatemachine.md#currentstatename)`get` | | string [**ComponentName**](/scripting/client-scripting-api-reference/components/sstatemachine.md#componentname) `get` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/sstatemachine.md#gameobject)`get` | #### Functions[​](#functions "Direct link to Functions") ##### NextState[​](#nextstate "Direct link to NextState") void **NextState** () *Enter the next state* * Lua ```lua Space.Host.ExecutingObject.StateMachine.NextState() ``` ##### PrevState[​](#prevstate "Direct link to PrevState") void **PrevState** () * Lua ```lua Space.Host.ExecutingObject.StateMachine.PrevState() ``` ##### SetState[​](#setstate "Direct link to SetState") void **SetState** (int state)
void **SetState** (string state) *Enters the state of being set that its order is "state"* | Parameter | Type | Description | | --------- | ------ | ------------------------------------------------------------ | | state | int | The index of the state. First state is 1. | | state | string | The name of the state as set in the State Machine component. | * Lua ```lua Space.Host.ExecutingObject.StateMachine.SetState(2) --or Space.Host.ExecutingObject.StateMachine.SetState('A State Name') ``` ##### BindToUI[​](#bindtoui "Direct link to BindToUI") void **BindToUI** ()
void **BindToUI** ([SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) go) *The state machine will bind itself to all Toggles, Buttons, Dropdowns and Sliders on the SGameObject it is in or on a specified SGameObject.* *Binding to Button : Clicking button will call NextState()*
*Binding to Toggle: Toggle On sets State to 1, Toggle Off sets state to 2*
*Binding to Dropdown: Selecting will set State to that selection's caption text*
*Binding to Slider: Moving slider changes State to slider value* | Parameter | Type | Description | | --------- | ----------- | ------------------------------------------------------------- | | go | SGameObject | A specific SGameObject which this State Machine will bind to. | * Lua ```lua Space.Host.ExecutingObject.StateMachine.BindToUI() ----or Space.Host.ExecutingObject.StateMachine.BindToUI(Space.Host.GetReference("a reference")) ``` #### Properties[​](#properties "Direct link to Properties") ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` *Whether the simple state machine component is Enabled or not* * Lua ```lua Space.Host.ExecutingObject.StateMachine.Enabled = false ``` ##### StateCount[​](#statecount "Direct link to StateCount") int **StateCount** `get` *Total number of States.* * Lua ```lua numberOfStates = Space.Host.ExecutingObject.StateMachine.StateCount ``` ##### StateNames[​](#statenames "Direct link to StateNames") string\[] **StateNames** `get` *A list of the names of all States.* * Lua ```lua tableStateNames = Space.Host.ExecutingObject.StateMachine.StateNames ``` ##### CurrentState[​](#currentstate "Direct link to CurrentState") int **CurrentState** `get` *The index number of the current state.* * Lua ```lua currentState = Space.Host.ExecutingObject.StateMachine.CurrentState ``` ##### CurrentStateName[​](#currentstatename "Direct link to CurrentStateName") string **CurrentStateName** `get` *The name of the current state, or null if no state.* * Lua ```lua currentStateName = Space.Host.ExecutingObject.StateMachine.CurrentStateName ``` ##### ComponentName[​](#componentname "Direct link to ComponentName") string **ComponentName** `get` *The name of this component.* * Lua ```lua componentName = Space.Host.ExecutingObject.StateMachine.ComponentName ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *The GameObject this component is attached to. A component is always attached to a GameObject.* * Lua ```lua theGameObject = Space.Host.ExecutingObject.StateMachine.GameObject ``` --- ### STerrain #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | Description | | -------------------------------------------------------------------- | ------------------------------------------------------------- | | float [**GetHeight** ](sterrain#getheight)(float x, float y) | Get an interpolated height at a point x,y. | | float [**GetSteepness** ](sterrain#getsteepness)(float x, float y) | Get the gradient of the terrain at point (x,y). | | float\[,] [**GetHeights** ](sterrain#getheights)() | Get an array of heightmap samples. | | void [**SetHeights** ](sterrain#setheights)(float\[,] data) | Set the resolution of the detail map. | | void [**SetHeight** ](sterrain#setheight)(int x, int y, float value) | Set value to height of \[x,y] | | SVector [**GetNormal** ](sterrain#getnormal)(float x, float y) | Get an interpolated normal at a given location. | | SVector [**GetSlope** ](sterrain#getslope)(float x, float y) | Get a normalized and interpolated normal at a given location. | | SVector [**GetContour** ](sterrain#getcontour)(float x, float y) | Get a contour of interpolated normal at a given location. | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | --------------------------------------------------------------------------------------------------------------- | | bool [**Enabled** ](/scripting/client-scripting-api-reference/components/sterrain.md#enabled)`get` `set` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/sterrain.md#gameobject)`get` | #### Functions[​](#functions "Direct link to Functions") ##### GetHeight[​](#getheight "Direct link to GetHeight") float **GetHeight** (float x, float y) *Get an interpolated height at a point x,y.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua floatHeight = Space.Host.ExecutingObject.Terrain.GetHeight(1,1) ``` ##### GetSteepness[​](#getsteepness "Direct link to GetSteepness") float **GetSteepness** (float x, float y) *Get the gradient of the terrain at point (x,y).* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua floatSteepness = Space.Host.ExecutingObject.Terrain.GetSteepness(1,1) ``` ##### GetHeights[​](#getheights "Direct link to GetHeights") float\[,] **GetHeights** () *Returns a two dimensional array of heightmap samples. The samples are represented as float values ranging from 0 to 1. The array has the dimensions \[height,width] and is indexed as \[y,x].* * Lua ```lua tableHeights = Space.Host.ExecutingObject.Terrain.GetHeights() ``` ##### SetHeights[​](#setheights "Direct link to SetHeights") void **SetHeights** (float\[,] data) *Sets heightmap data using a two dimensional array of heightmap samples. The samples are represented as float values ranging from 0 to 1. The heights array is indexed as \[y,x].* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua tableHeights = Space.Host.ExecutingObject.Terrain.SetHeights({{1,2},{1,2}}) ``` ##### SetHeight[​](#setheight "Direct link to SetHeight") void **SetHeight** (int x, int y, float value) *Set value to height of \[x,y]* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Terrain.SetHeight(1,1,0.11) ``` ##### GetNormal[​](#getnormal "Direct link to GetNormal") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **GetNormal** (float x, float y) *Get an interpolated normal at a given location.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua vectorNormal = Space.Host.ExecutingObject.Terrain.GetNormal(1,1) ``` ##### GetSlope[​](#getslope "Direct link to GetSlope") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **GetSlope** (float x, float y) *Get a normalized and interpolated normal at a given location.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua vectorSlope = Space.Host.ExecutingObject.Terrain.GetSlope(1,1) ``` ##### GetContour[​](#getcontour "Direct link to GetContour") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **GetContour** (float x, float y) *Get a contour of interpolated normal at a given location.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua vectorContour = Space.Host.ExecutingObject.Terrain.GetContour(1,1) ``` #### Properties[​](#properties "Direct link to Properties") ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` *Is the Terrain component enabled?* * Lua ```lua Space.Host.ExecutingObject.Terrain.Enabled = false ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *The GameObject that this Terrain component is added to.* * Lua ```lua theGameObject = Space.Host.ExecutingObject.Terrain.GameObject ``` --- ### STrailRenderer #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | ------------------------------------------------------------------------------------------------------------------------- | | void [**Clear** ](/scripting/client-scripting-api-reference/components/strailrenderer.md#clear)() | | SVector [**GetPosition** ](/scripting/client-scripting-api-reference/components/strailrenderer.md#getposition)(int index) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ----------------------------------------------------------------------------------------------------------------------------------- | | bool [**Enabled** ](/scripting/client-scripting-api-reference/components/strailrenderer.md#enabled)`get` `set` | | bool [**ReceiveShadows** ](/scripting/client-scripting-api-reference/components/strailrenderer.md#receiveshadows)`get` `set` | | bool [**IsVisible** ](/scripting/client-scripting-api-reference/components/strailrenderer.md#isvisible)`get` | | bool [**CastShadows** ](/scripting/client-scripting-api-reference/components/strailrenderer.md#castshadows)`get` `set` | | bool [**MotionVectors** ](/scripting/client-scripting-api-reference/components/strailrenderer.md#motionvectors)`get` `set` | | bool [**UseLightProbes** ](/scripting/client-scripting-api-reference/components/strailrenderer.md#uselightprobes)`get` `set` | | float [**Time** ](/scripting/client-scripting-api-reference/components/strailrenderer.md#time)`get` `set` | | float [**StartWidth** ](/scripting/client-scripting-api-reference/components/strailrenderer.md#startwidth)`get` `set` | | float [**EndWidth** ](/scripting/client-scripting-api-reference/components/strailrenderer.md#endwidth)`get` `set` | | float [**WidthMultiplier** ](/scripting/client-scripting-api-reference/components/strailrenderer.md#widthmultiplier)`get` `set` | | SColor [**StartColor** ](/scripting/client-scripting-api-reference/components/strailrenderer.md#startcolor)`get` `set` | | SColor [**EndColor** ](/scripting/client-scripting-api-reference/components/strailrenderer.md#endcolor)`get` `set` | | bool [**Autodestruct** ](/scripting/client-scripting-api-reference/components/strailrenderer.md#autodestruct)`get` `set` | | int [**NumCornerVertices** ](/scripting/client-scripting-api-reference/components/strailrenderer.md#numcornervertices)`get` `set` | | int [**NumCapVertices** ](/scripting/client-scripting-api-reference/components/strailrenderer.md#numcapvertices)`get` `set` | | float [**MinVertexDistance** ](/scripting/client-scripting-api-reference/components/strailrenderer.md#minvertexdistance)`get` `set` | | int [**TextureMode** ](/scripting/client-scripting-api-reference/components/strailrenderer.md#texturemode)`get` `set` | | int [**Alignment** ](/scripting/client-scripting-api-reference/components/strailrenderer.md#alignment)`get` `set` | | int [**PositionCount** ](/scripting/client-scripting-api-reference/components/strailrenderer.md#positioncount)`get` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/strailrenderer.md#gameobject)`get` | #### Functions[​](#functions "Direct link to Functions") ##### Clear[​](#clear "Direct link to Clear") void **Clear** () *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.TrailRenderer.Clear() ``` ##### GetPosition[​](#getposition "Direct link to GetPosition") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **GetPosition** (int index) *Get the position of a vertex in the trail.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua vectorPos = Space.Host.ExecutingObject.TrailRenderer.GetPosition(0) ``` #### Properties[​](#properties "Direct link to Properties") ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` *Whether this TrailRenderer component is Enabled.* * Lua ```lua Space.Host.ExecutingObject.TrailRenderer.Enabled = true ``` * Lua ```lua --Clicking the object Enables/Disables the Trail Renderer component on this object --[Add "trailrenderer" reference to the Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject trailrenderer = Space.Host.GetReference("trailrenderer").TrailRenderer OnClick = function() trailrenderer.Enabled = not trailrenderer.Enabled end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### ReceiveShadows[​](#receiveshadows "Direct link to ReceiveShadows") bool **ReceiveShadows** `get` `set` *Does this object receive shadows?* * Lua ```lua Space.Host.ExecutingObject.TrailRenderer.ReceiveShadows = true ``` * Lua ```lua --Make a UIToggle disable/enable the Receive Shadows feature of a Trail Renderer --[Add "toggle" and "trailrenderer" references to the Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject toggle = Space.Host.GetReference("toggle").UIToggle trailrenderer = Space.Host.GetReference("trailrenderer").TrailRenderer toggle.IsOn = trailrenderer.ReceiveShadows --make toggle start at correct state OVC = function() if toggle.IsOn then trailrenderer.ReceiveShadows = true else trailrenderer.ReceiveShadows = false end end toggle.OnValueChanged(OVC) ``` ##### IsVisible[​](#isvisible "Direct link to IsVisible") bool **IsVisible** `get` *Is this renderer visible in any camera?* * Lua ```lua Space.Log(Space.Host.ExecutingObject.TrailRenderer.IsVisible) ``` ##### CastShadows[​](#castshadows "Direct link to CastShadows") bool **CastShadows** `get` `set` *Does the trail cast a shadow when a shadow-casting Light shines on it?* * Lua ```lua Space.Host.ExecutingObject.TrailRenderer.CastShadows = true ``` * Lua ```lua --Make a UIToggle disable/enable the Cast Shadows feature of a Trail Renderer --[Add "toggle" and "trailrenderer" references to the Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject toggle = Space.Host.GetReference("toggle").UIToggle trailrenderer = Space.Host.GetReference("trailrenderer").TrailRenderer toggle.IsOn = trailrenderer.CastShadows --make toggle start at correct state OVC = function() if toggle.IsOn then trailrenderer.CastShadows = true else trailrenderer.CastShadows = false end end toggle.OnValueChanged(OVC) ``` ##### MotionVectors[​](#motionvectors "Direct link to MotionVectors") bool **MotionVectors** `get` `set` *Set whether to use motion vectors to track this Renderer’s per-pixel, screen-space motion from one frame to the next. You can use this information to apply post-processing effects such as motion blur.* * Lua ```lua Space.Host.ExecutingObject.TrailRenderer.MotionVectors = true ``` * Lua ```lua --Make a UIToggle disable/enable the Motion Vectors feature of a Trail Renderer --[Add "toggle" and "trailrenderer" references to the Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject toggle = Space.Host.GetReference("toggle").UIToggle trailrenderer = Space.Host.GetReference("trailrenderer").TrailRenderer toggle.IsOn = trailrenderer.MotionVectors --make toggle start at correct state OVC = function() if toggle.IsOn then trailrenderer.MotionVectors = true else trailrenderer.MotionVectors = false end end toggle.OnValueChanged(OVC) ``` ##### UseLightProbes[​](#uselightprobes "Direct link to UseLightProbes") bool **UseLightProbes** `get` `set` *Enable Light Probes on the trail.* * Lua ```lua Space.Host.ExecutingObject.TrailRenderer.UseLightProbes = true ``` * Lua ```lua --Make a UIToggle disable/enable the Light Probes feature of a Trail Renderer --[Add "toggle" and "trailrenderer" references to the Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject toggle = Space.Host.GetReference("toggle").UIToggle trailrenderer = Space.Host.GetReference("trailrenderer").TrailRenderer toggle.IsOn = trailrenderer.UseLightProbes --make toggle start at correct state OVC = function() if toggle.IsOn then trailrenderer.UseLightProbes = true else trailrenderer.UseLightProbes = false end end toggle.OnValueChanged(OVC) ``` ##### Time[​](#time "Direct link to Time") float **Time** `get` `set` *How long does the trail take to fade out. (seconds)* * Lua ```lua Space.Host.ExecutingObject.TrailRenderer.Time = 10 ``` * Lua ```lua --Make a slider change the Trail Renderer's Time --[Add "slider" and "trailrenderer" references to the Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject slider = Space.Host.GetReference("slider").UISlider trailrenderer = Space.Host.GetReference("trailrenderer").TrailRenderer OVC = function() trailrenderer.Time = slider.Value * 10 --0 to 10 end slider.OnValueChanged(OVC) ``` ##### StartWidth[​](#startwidth "Direct link to StartWidth") float **StartWidth** `get` `set` *The width of the trail at the spawning point. A width of 1 corresponds to 1 unit in the game world.* * Lua ```lua Space.Host.ExecutingObject.TrailRenderer.StartWidth = 1.1 ``` * Lua ```lua --Make a slider change the Trail Renderer's Start Width --[Add "slider" and "trailrenderer" references to the Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject slider = Space.Host.GetReference("slider").UISlider trailrenderer = Space.Host.GetReference("trailrenderer").TrailRenderer OVC = function() trailrenderer.StartWidth = slider.Value * 10 --0 to 10 end slider.OnValueChanged(OVC) ``` ##### EndWidth[​](#endwidth "Direct link to EndWidth") float **EndWidth** `get` `set` *The width of the trail at the end of the trail. A width of 1 corresponds to 1 unit in the game world.* * Lua ```lua Space.Host.ExecutingObject.TrailRenderer.EndWidth = 0.1 ``` * Lua ```lua --Make a slider change the Trail Renderer's End Width --[Add "slider" and "trailrenderer" references to the Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject slider = Space.Host.GetReference("slider").UISlider trailrenderer = Space.Host.GetReference("trailrenderer").TrailRenderer OVC = function() trailrenderer.EndWidth = slider.Value * 10 --0 to 10 end slider.OnValueChanged(OVC) ``` ##### WidthMultiplier[​](#widthmultiplier "Direct link to WidthMultiplier") float **WidthMultiplier** `get` `set` *Set an overall multiplier that is applied to the TrailRenderer.widthCurve to get the final width of the trail.* * Lua ```lua Space.Host.ExecutingObject.TrailRenderer.WidthMultiplier = 2 ``` * Lua ```lua --Make a slider change the Trail Renderer's Width Multiplier --[Add "slider" and "trailrenderer" references to the Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject slider = Space.Host.GetReference("slider").UISlider trailrenderer = Space.Host.GetReference("trailrenderer").TrailRenderer OVC = function() trailrenderer.WidthMultiplier = slider.Value * 10 --0 to 10 end slider.OnValueChanged(OVC) ``` ##### StartColor[​](#startcolor "Direct link to StartColor") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **StartColor** `get` `set` *Set the color at the start of the trail.* * Lua ```lua Space.Host.ExecutingObject.TrailRenderer.StartColor = Color.Black ``` * Lua ```lua --makes UIButton open a color picker to change TrailRenderer's Start Color --[Add "button" and "trailrenderer" references to the Scripting Runtime component] button = Space.Host.GetReference("button").UIButton trailrenderer = Space.Host.GetReference("trailrenderer").TrailRenderer originalColor = trailrenderer.StartColor OnChange = function(SColor) trailrenderer.StartColor = SColor end OnSelect = function(SColor) trailrenderer.StartColor = SColor end OnCancel = function() trailrenderer.StartColor = originalColor end OnClick = function() Space.Dialogues.ColorPicker("title","okbutton", OnChange, OnSelect, OnCancel, originalColor) end button.OnClick(OnClick) ``` ##### EndColor[​](#endcolor "Direct link to EndColor") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **EndColor** `get` `set` *Set the color at the end of the trail.* * Lua ```lua Space.Host.ExecutingObject.TrailRenderer.EndColor = Color.Red ``` * Lua ```lua --makes UIButton open a color picker to change TrailRenderer's End Color --[Add "button" and "trailrenderer" references to the Scripting Runtime component] button = Space.Host.GetReference("button").UIButton trailrenderer = Space.Host.GetReference("trailrenderer").TrailRenderer originalColor = trailrenderer.EndColor OnChange = function(SColor) trailrenderer.EndColor = SColor end OnSelect = function(SColor) trailrenderer.EndColor = SColor end OnCancel = function() trailrenderer.EndColor = originalColor end OnClick = function() Space.Dialogues.ColorPicker("title","okbutton", OnChange, OnSelect, OnCancel, originalColor) end button.OnClick(OnClick) ``` ##### Autodestruct[​](#autodestruct "Direct link to Autodestruct") bool **Autodestruct** `get` `set` *Does the GameObject of this Trail Renderer auto destruct?* * Lua ```lua Space.Host.ExecutingObject.TrailRenderer.Autodestruct = true ``` * Lua ```lua --Make a UIToggle disable/enable the Autodestruct feature of a Trail Renderer --[Add "toggle" and "trailrenderer" references to the Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject toggle = Space.Host.GetReference("toggle").UIToggle trailrenderer = Space.Host.GetReference("trailrenderer").TrailRenderer toggle.IsOn = trailrenderer.Autodestruct --make toggle start at correct state OVC = function() if toggle.IsOn then trailrenderer.Autodestruct = true else trailrenderer.Autodestruct = false end end toggle.OnValueChanged(OVC) ``` ##### NumCornerVertices[​](#numcornervertices "Direct link to NumCornerVertices") int **NumCornerVertices** `get` `set` *Set this to a value greater than 0, to get rounded corners between each segment of the trail.* * Lua ```lua Space.Host.ExecutingObject.TrailRenderer.NumCornerVertices = 2 ``` * Lua ```lua --Make a slider change the Trail Renderer's Number of Corner Vertices --[Add "slider" and "trailrenderer" references to the Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject slider = Space.Host.GetReference("slider").UISlider trailrenderer = Space.Host.GetReference("trailrenderer").TrailRenderer OVC = function() trailrenderer.NumCornerVertices = slider.Value * 90 --0 to 90 end slider.OnValueChanged(OVC) ``` ##### NumCapVertices[​](#numcapvertices "Direct link to NumCapVertices") int **NumCapVertices** `get` `set` *Set this to a value greater than 0, to get rounded corners on each end of the trail.* * Lua ```lua Space.Host.ExecutingObject.TrailRenderer.NumCapVertices = 3 ``` * Lua ```lua --Make a slider change the Trail Renderer's Number of End Cap Vertices --[Add "slider" and "trailrenderer" references to the Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject slider = Space.Host.GetReference("slider").UISlider trailrenderer = Space.Host.GetReference("trailrenderer").TrailRenderer OVC = function() trailrenderer.NumCapVertices = slider.Value * 90 --0 to 90 end slider.OnValueChanged(OVC) ``` ##### MinVertexDistance[​](#minvertexdistance "Direct link to MinVertexDistance") float **MinVertexDistance** `get` `set` *Set the minimum distance the trail can travel before a new vertex is added to it. Smaller values with give smoother trails, consisting of more vertices, but costing more performance.* * Lua ```lua Space.Host.ExecutingObject.TrailRenderer.MinVertexDistance = 1 ``` * Lua ```lua --Make a slider change the Trail Renderer's Number of Mininum Vertex Distance --[Add "slider" and "trailrenderer" references to the Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject slider = Space.Host.GetReference("slider").UISlider trailrenderer = Space.Host.GetReference("trailrenderer").TrailRenderer OVC = function() trailrenderer.MinVertexDistance = slider.Value * 10 --0 to 10 end slider.OnValueChanged(OVC) ``` ##### TextureMode[​](#texturemode "Direct link to TextureMode") int **TextureMode** `get` `set` *Choose whether the U coordinate of the trail texture is tiled or stretched. 0 Stretch, 1 Tile, 2 Distribute Per Segment, 3 Repeat Per Segment* * Lua ```lua Space.Host.ExecutingObject.TrailRenderer.TextureMode = 2 ``` * Lua ```lua --Clicking the object toggles between TrailRenderer's 4 different Texture Modes --[Add "trailrenderer" reference to the Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject trailrenderer = Space.Host.GetReference("trailrenderer").TrailRenderer OnClick = function() if trailrenderer.TextureMode == 3 then trailrenderer.TextureMode = 0 else trailrenderer.TextureMode = trailrenderer.TextureMode + 1 end end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### Alignment[​](#alignment "Direct link to Alignment") int **Alignment** `get` `set` *Property Description* * Lua ```lua Space.Host.ExecutingObject.TrailRenderer.Alignment = 1 ``` * Lua ```lua --Clicking the object toggles between TrailRenderer's View or Transform Z alignment --[Add "trailrenderer" reference to the Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject trailrenderer = Space.Host.GetReference("trailrenderer").TrailRenderer OnClick = function() if trailrenderer.Alignment == 0 then trailrenderer.Alignment = 1 else trailrenderer.Alignment = 0 end end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### PositionCount[​](#positioncount "Direct link to PositionCount") int **PositionCount** `get` *Get the number of line segments in the trail.* * Lua ```lua numLineSegments = Space.Host.ExecutingObject.TrailRenderer.PositionCount ``` ##### GameObject[​](#gameobject "Direct link to GameObject") SGameObject **GameObject** `get` *Property Description* * Lua ```lua theGameObject = Space.Host.ExecutingObject.TrailRenderer.GameObject ``` --- ### SUIButton #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | ---------------------------------------------------------------------------------------------------------------- | | void [**OnClick** ](/scripting/client-scripting-api-reference/components/suibutton.md#onclick)(Closure callback) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ----------------------------------------------------------------------------------------------------------------------------- | | bool [**Enabled** ](/scripting/client-scripting-api-reference/components/suibutton.md#enabled)`get` `set` | | bool [**Interactable** ](/scripting/client-scripting-api-reference/components/suibutton.md#interactable)`get` `set` | | SColor [**NormalColor** ](/scripting/client-scripting-api-reference/components/suibutton.md#normalcolor)`get` `set` | | SColor [**HighlightedColor** ](/scripting/client-scripting-api-reference/components/suibutton.md#highlightedcolor)`get` `set` | | SColor [**PressedColor** ](/scripting/client-scripting-api-reference/components/suibutton.md#pressedcolor)`get` `set` | | SColor [**DisabledColor** ](/scripting/client-scripting-api-reference/components/suibutton.md#disabledcolor)`get` `set` | | float [**ColorMultiplier** ](/scripting/client-scripting-api-reference/components/suibutton.md#colormultiplier)`get` `set` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/suibutton.md#gameobject)`get` | #### Functions[​](#functions "Direct link to Functions") ##### OnClick[​](#onclick "Direct link to OnClick") void **OnClick** (Closure callback) *Invoke when a user clicks the button and releases it.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua function OnClickFunction() -- end Space.Host.ExecutingObject.UIButton.OnClick(OnClickFunction) ``` #### Properties[​](#properties "Direct link to Properties") ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` *Whether the button component is Enabled.* * Lua ```lua Space.Host.ExecutingObject.UIButton.Enabled = true ``` * Lua ```lua --clicking this object will toggle Enable/Disable an object's Button component thisGameObject = Space.Host.ExecutingObject button = Space.Host.GetReference("button").UIButton --make sure to add this reference to the Scripting Runtime component OnClick = function() button.Enabled = not button.Enabled end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### Interactable[​](#interactable "Direct link to Interactable") bool **Interactable** `get` `set` *Enable Interactable if you want this button to accept input.* * Lua ```lua Space.Host.ExecutingObject.UIButton.Interactable = true ``` * Lua ```lua --clicking this object will toggle Interactable status on an object's Button component thisGameObject = Space.Host.ExecutingObject button = Space.Host.GetReference("button").UIButton --make sure to add this reference to the Scripting Runtime component OnClick = function() button.Interactable= not button.Interactable end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### NormalColor[​](#normalcolor "Direct link to NormalColor") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **NormalColor** `get` `set` *The normal color of the control.* * Lua ```lua Space.Host.ExecutingObject.UIButton.NormalColor = Color.Red ``` ##### HighlightedColor[​](#highlightedcolor "Direct link to HighlightedColor") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **HighlightedColor** `get` `set` *The color of the control when it is highlighted.* * Lua ```lua Space.Host.ExecutingObject.UIButton.NormalColor = Color.Red ``` ##### PressedColor[​](#pressedcolor "Direct link to PressedColor") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **PressedColor** `get` `set` *The color of the control when it is pressed.* * Lua ```lua Space.Host.ExecutingObject.UIButton.PressedColor = Color.Red ``` ##### DisabledColor[​](#disabledcolor "Direct link to DisabledColor") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **DisabledColor** `get` `set` *The color of the control when it is disabled.* * Lua ```lua Space.Host.ExecutingObject.UIButton.PressedColor = Color.Red ``` ##### ColorMultiplier[​](#colormultiplier "Direct link to ColorMultiplier") float **ColorMultiplier** `get` `set` *This multiplies the tint color for each transition by its value. With this you can create colors greater than 1 to brighten the colors on graphic elements whose base color is less than white.* * Lua ```lua Space.Host.ExecutingObject.UIButton.ColorMultiplier = Color.Red ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua ```lua Space.Host.ExecutingObject.UIButton.GameObject = Color.Red ``` --- ### SUICanvas #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ---------------------------------------------------------------------------------------------------------------------------------------------- | | bool [**IsRootCanvas** ](/scripting/client-scripting-api-reference/components/suicanvas.md#isrootcanvas)`get` | | float [**ScaleFactor** ](/scripting/client-scripting-api-reference/components/suicanvas.md#scalefactor)`get` `set` | | float [**ReferencePixelsPerUnit** ](/scripting/client-scripting-api-reference/components/suicanvas.md#referencepixelsperunit)`get` `set` | | bool [**PixelPerfect** ](/scripting/client-scripting-api-reference/components/suicanvas.md#pixelperfect)`get` `set` | | float [**PlaneDistance** ](/scripting/client-scripting-api-reference/components/suicanvas.md#planedistance)`get` `set` | | int [**SortingOrder** ](/scripting/client-scripting-api-reference/components/suicanvas.md#sortingorder)`get` `set` | | int [**TargetDisplay** ](/scripting/client-scripting-api-reference/components/suicanvas.md#targetdisplay)`get` `set` | | float [**NormalizedSortingGridSize** ](/scripting/client-scripting-api-reference/components/suicanvas.md#normalizedsortinggridsize)`get` `set` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/suicanvas.md#gameobject)`get` | #### Properties[​](#properties "Direct link to Properties") ##### IsRootCanvas[​](#isrootcanvas "Direct link to IsRootCanvas") bool **IsRootCanvas** `get` *The avoidance radius for the agent.* * Lua ```lua IsRootCanvas = Space.Host.ExecutingObject.UICanvas.IsRootCanvas ``` ##### ScaleFactor[​](#scalefactor "Direct link to ScaleFactor") float **ScaleFactor** `get` `set` *Scales all UI elements in the Canvas by this factor.* * Lua ```lua Space.Host.ExecutingObject.UICanvas.ScaleFactor = 2.0 ``` ##### ReferencePixelsPerUnit[​](#referencepixelsperunit "Direct link to ReferencePixelsPerUnit") float **ReferencePixelsPerUnit** `get` `set` *If a sprite has this "Pixels Per Unit" setting, then one pixel in the sprite will cover one unit in the UI.* * Lua ```lua Space.Host.ExecutingObject.UICanvas.ReferencePixelsPerUnit = 50.0 ``` ##### PixelPerfect[​](#pixelperfect "Direct link to PixelPerfect") bool **PixelPerfect** `get` `set` *Should the UI be rendered without antialiasing for precision?* * Lua ```lua Space.Host.ExecutingObject.UICanvas.PixelPerfect = true ``` ##### PlaneDistance[​](#planedistance "Direct link to PlaneDistance") float **PlaneDistance** `get` `set` *The distance at which the UI plane should be placed in front of the camera.* * Lua ```lua Space.Host.ExecutingObject.UICanvas.PlaneDistance = 2.0 ``` ##### SortingOrder[​](#sortingorder "Direct link to SortingOrder") int **SortingOrder** `get` `set` *Canvas' order within a sorting layer.* * Lua ```lua Space.Host.ExecutingObject.UICanvas.SortingOrder = 2.0 ``` ##### TargetDisplay[​](#targetdisplay "Direct link to TargetDisplay") int **TargetDisplay** `get` `set` *For Overlay mode, display index on which the UI canvas will appear.* * Lua ```lua Space.Host.ExecutingObject.UICanvas.TargetDisplay = 1 ``` ##### NormalizedSortingGridSize[​](#normalizedsortinggridsize "Direct link to NormalizedSortingGridSize") float **NormalizedSortingGridSize** `get` `set` *The normalized grid size that the canvas will split the renderable area into.* * Lua ```lua Space.Host.ExecutingObject.UICanvas.NormalizedSortingGridSize = 5.0 ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua ```lua theGameObject = Space.Host.ExecutingObject.UICanvas.GameObject ``` --- ### SUIDropdown #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | void [**RefreshShownValue** ](/scripting/client-scripting-api-reference/components/suidropdown.md#refreshshownvalue)() | | void [**AddOptions** ](suidropdown#addoptions)(string\[] options)
void [**AddOptions** ](suidropdown#addoptions)(Table options)
void [**AddOptions** ](suidropdown#addoptions)(SResource\[] optionsSprites) | | void [**ClearOptions** ](/scripting/client-scripting-api-reference/components/suidropdown.md#clearoptions)() | | void [**Show** ](/scripting/client-scripting-api-reference/components/suidropdown.md#show)() | | void [**Hide** ](/scripting/client-scripting-api-reference/components/suidropdown.md#hide)() | | void [**OnValueChanged** ](/scripting/client-scripting-api-reference/components/suidropdown.md#onvaluechanged)(Closure callback) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ------------------------------------------------------------------------------------------------------------------------------- | | bool [**Interactable** ](/scripting/client-scripting-api-reference/components/suidropdown.md#interactable)`get` `set` | | SGameObject [**Template** ](/scripting/client-scripting-api-reference/components/suidropdown.md#template)`get` `set` | | SUIText [**CaptionText** ](/scripting/client-scripting-api-reference/components/suidropdown.md#captiontext)`get` `set` | | SUIImage [**CaptionImage** ](/scripting/client-scripting-api-reference/components/suidropdown.md#captionimage)`get` `set` | | SUIText [**ItemText** ](/scripting/client-scripting-api-reference/components/suidropdown.md#itemtext)`get` `set` | | SUIImage [**ItemImage** ](/scripting/client-scripting-api-reference/components/suidropdown.md#itemimage)`get` `set` | | string\[] [**OptionsAsText** ](/scripting/client-scripting-api-reference/components/suidropdown.md#optionsastext)`get` | | SResource\[] [**OptionsAsSprites** ](/scripting/client-scripting-api-reference/components/suidropdown.md#optionsassprites)`get` | | int [**Value** ](/scripting/client-scripting-api-reference/components/suidropdown.md#value)`get` `set` | | SColor [**NormalColor** ](/scripting/client-scripting-api-reference/components/suidropdown.md#normalcolor)`get` `set` | | SColor [**HighlightedColor** ](/scripting/client-scripting-api-reference/components/suidropdown.md#highlightedcolor)`get` `set` | | SColor [**PressedColor** ](/scripting/client-scripting-api-reference/components/suidropdown.md#pressedcolor)`get` `set` | | SColor [**DisabledColor** ](/scripting/client-scripting-api-reference/components/suidropdown.md#disabledcolor)`get` `set` | | float [**ColorMultiplier** ](/scripting/client-scripting-api-reference/components/suidropdown.md#colormultiplier)`get` `set` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/suidropdown.md#gameobject)`get` | #### Functions[​](#functions "Direct link to Functions") ##### RefreshShownValue[​](#refreshshownvalue "Direct link to RefreshShownValue") void **RefreshShownValue** () *Refreshes the text and image (if available) of the currently selected option.If you have modified the list of options, you should call this method afterwards to ensure that the visual state of the dropdown corresponds to the updated options.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.UIDropdown.RefreshShownValue() ``` ##### AddOptions[​](#addoptions "Direct link to AddOptions") void **AddOptions** (string\[] options)
void **AddOptions** (Table options)
void **AddOptions** ([SResource](/scripting/client-scripting-api-reference/types/sresource.md)\[] optionsSprites) *Add multiple options to the options of the Dropdown.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.UIDropdown.AddOptions({"option1","option2","option3"}) ``` ##### ClearOptions[​](#clearoptions "Direct link to ClearOptions") void **ClearOptions** () *Clear the list of options in the Dropdown.* * Lua ```lua Space.Host.ExecutingObject.UIDropdown.ClearOptions() ``` ##### Show[​](#show "Direct link to Show") void **Show** () *Show the dropdown list.* * Lua ```lua Space.Host.ExecutingObject.UIDropdown.Show() ``` ##### Hide[​](#hide "Direct link to Hide") void **Hide** () *Hide the dropdown list.* * Lua ```lua Space.Host.ExecutingObject.UIDropdown.Hide() ``` ##### OnValueChanged[​](#onvaluechanged "Direct link to OnValueChanged") void **OnValueChanged** (Closure callback) *Bind a function to handle the event that is invoked when when a user has clicked one of the options in the dropdown list.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua function AFunction() -- end Space.Host.ExecutingObject.UIDropdown.OnValueChanged(AFunction) ``` ##### SetValueByText[​](#setvaluebytext "Direct link to SetValueByText") bool **SetValueByText** (string text) *Attempts to set the dropdown to the first option in the dropdown list that matches the inputted text. Returns true if found, false if no matches found.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.UIDropdown.SetValueByText("Value Text") ``` * Lua ```lua --Populating a UIDropdown and making a selection using value's text dropDown=Space.Host.GetReference("DropDown").UIDropdown options = {"Room 1", "Room 2", "Room 3", "Room 4"} dropDown.AddOptions(options) dropDown.SetValueByText("Room 3") ``` #### Properties[​](#properties "Direct link to Properties") ##### Interactable[​](#interactable "Direct link to Interactable") bool **Interactable** `get` `set` *Is this UIDropdown interactable?* * Lua ```lua Space.Host.ExecutingObject.UIDropdown.Interactable = true ``` * Lua ```lua --clicking this object will toggle a UIDropdown's interactable status thisGameObject = Space.Host.ExecutingObject dropdown = Space.Host.GetReference("dropdown").UIDropdown --make sure to add this reference to the Scripting Runtime component OnClick = function() dropdown.Interactable = not dropdown.Interactable end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### Template[​](#template "Direct link to Template") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **Template** `get` `set` *The Rect Transform of the template for the dropdown list.* * Lua ```lua aReferenceToAGameObject = Space.Host.GetReference("reference name") Space.Host.ExecutingObject.UIDropdown.Template = aReferenceToAGameObject ``` ##### CaptionText[​](#captiontext "Direct link to CaptionText") [SUIText](/scripting/client-scripting-api-reference/components/suitext.md) **CaptionText** `get` `set` *The Text component to hold the text of the currently selected option.* * Lua ```lua captionText = Space.Host.ExecutingObject.UIDropdown.CaptionText captionText.Text = "new caption" ``` ##### CaptionImage[​](#captionimage "Direct link to CaptionImage") [SUIImage](/scripting/client-scripting-api-reference/components/suiimage.md) **CaptionImage** `get` `set` *The Image component to hold the image of the currently selected option.* * Lua ```lua aReferenceToAGameObject = Space.Host.GetReference("reference name") Space.Host.ExecutingObject.UIDropdown.CaptionImage = aReferenceToAGameObject.UIImage ``` ##### ItemText[​](#itemtext "Direct link to ItemText") [SUIText](/scripting/client-scripting-api-reference/components/suitext.md) **ItemText** `get` `set` *The Text component to hold the text of the item.* * Lua ```lua aReferenceToAGameObject = Space.Host.GetReference("reference name") Space.Host.ExecutingObject.UIDropdown.CaptionImage = aReferenceToAGameObject.UIText ``` ##### ItemImage[​](#itemimage "Direct link to ItemImage") [SUIImage](/scripting/client-scripting-api-reference/components/suiimage.md) **ItemImage** `get` `set` *The Image component to hold the image of the item.* * Lua ```lua iaReferenceToAGameObject = Space.Host.GetReference("reference name") Space.Host.ExecutingObject.UIDropdown.CaptionImage = aReferenceToAGameObject.UIImage ``` ##### OptionsAsText[​](#optionsastext "Direct link to OptionsAsText") string\[] **OptionsAsText** `get` *The list of possible options. (Text)* * Lua ```lua optionsText = Space.Host.ExecutingObject.UIDropdown.OptionsAsText ``` ##### OptionsAsSprites[​](#optionsassprites "Direct link to OptionsAsSprites") [SResource](/scripting/client-scripting-api-reference/types/sresource.md)\[] **OptionsAsSprites** `get` *The list of possible options. (Sprites)* * Lua ```lua optionsSprites = Space.Host.ExecutingObject.UIDropdown.OptionsAsSprites ``` ##### Value[​](#value "Direct link to Value") int **Value** `get` `set` *The Value is the index number of the current selection in the Dropdown. 0 is the first option in the Dropdown, 1 is the second, and so on.* * Lua ```lua Space.Host.ExecutingObject.UIDropdown.Value= 2 ``` ##### NormalColor[​](#normalcolor "Direct link to NormalColor") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **NormalColor** `get` `set` *Property Description* * Lua ```lua Space.Host.ExecutingObject.UIDropdown.NormalColor = Color.Red ``` ##### HighlightedColor[​](#highlightedcolor "Direct link to HighlightedColor") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **HighlightedColor** `get` `set` *Property Description* * Lua ```lua Space.Host.ExecutingObject.UIDropdown.HighlightedColor = Color.Red ``` ##### PressedColor[​](#pressedcolor "Direct link to PressedColor") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **PressedColor** `get` `set` *Property Description* * Lua ```lua Space.Host.ExecutingObject.UIDropdown.PressedColor = Color.Red ``` ##### DisabledColor[​](#disabledcolor "Direct link to DisabledColor") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **DisabledColor** `get` `set` *Property Description* * Lua ```lua Space.Host.ExecutingObject.UIDropdown.DisabledColor = Color.Red ``` ##### ColorMultiplier[​](#colormultiplier "Direct link to ColorMultiplier") float **ColorMultiplier** `get` `set` *Property Description* * Lua ```lua Space.Host.ExecutingObject.UIDropdown.ColorMultiplier = Color.Red ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua ```lua Space.Host.ExecutingObject.UIDropdown.GameObject = Color.Red ``` --- ### SUIImage #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | --------------------------------------------------------------------------------------------------------------------------------------------------- | | SColor [**Color** ](/scripting/client-scripting-api-reference/components/suiimage.md#color)`get` `set` | | SResource [**Sprite** ](/scripting/client-scripting-api-reference/components/suiimage.md#sprite)`get` `set` | | bool [**PreserveAspect** ](/scripting/client-scripting-api-reference/components/suiimage.md#preserveaspect)`get` `set` | | bool [**FillCenter** ](/scripting/client-scripting-api-reference/components/suiimage.md#fillcenter)`get` `set` | | float [**FillAmount** ](/scripting/client-scripting-api-reference/components/suiimage.md#fillamount)`get` `set` | | bool [**FillClockwise** ](/scripting/client-scripting-api-reference/components/suiimage.md#fillclockwise)`get` `set` | | int [**FillOrigin** ](/scripting/client-scripting-api-reference/components/suiimage.md#fillorigin)`get` `set` | | float [**AlphaHitTestMinimumThreshold** ](/scripting/client-scripting-api-reference/components/suiimage.md#alphahittestminimumthreshold)`get` `set` | | bool [**HasBorder** ](/scripting/client-scripting-api-reference/components/suiimage.md#hasborder)`get` | | float [**PixelsPerUnit** ](/scripting/client-scripting-api-reference/components/suiimage.md#pixelsperunit)`get` | | SMaterial [**Material** ](/scripting/client-scripting-api-reference/components/suiimage.md#material)`get` `set` | | float [**MinWidth** ](/scripting/client-scripting-api-reference/components/suiimage.md#minwidth)`get` | | float [**PreferredWidth** ](/scripting/client-scripting-api-reference/components/suiimage.md#preferredwidth)`get` | | float [**FlexibleWidth** ](/scripting/client-scripting-api-reference/components/suiimage.md#flexiblewidth)`get` | | float [**MinHeight** ](/scripting/client-scripting-api-reference/components/suiimage.md#minheight)`get` | | float [**PreferredHeight** ](/scripting/client-scripting-api-reference/components/suiimage.md#preferredheight)`get` | | float [**FlexibleHeight** ](/scripting/client-scripting-api-reference/components/suiimage.md#flexibleheight)`get` | | int [**LayoutPriority** ](/scripting/client-scripting-api-reference/components/suiimage.md#layoutpriority)`get` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/suiimage.md#gameobject)`get` | #### Properties[​](#properties "Direct link to Properties") ##### Color[​](#color "Direct link to Color") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **Color** `get` `set` *Default Color of UIImage* * Lua ```lua Space.Host.ExecutingObject.UIImage.Color= Color.Red ``` ##### Sprite[​](#sprite "Direct link to Sprite") [SResource](/scripting/client-scripting-api-reference/types/sresource.md) **Sprite** `get` `set` *The sprite that is used to render this image.* * Lua ```lua Space.Host.ExecutingObject.UIImage.Sprite = Space.GetResource("resource name") ``` ##### PreserveAspect[​](#preserveaspect "Direct link to PreserveAspect") bool **PreserveAspect** `get` `set` *Whether this image should preserve its Sprite aspect ratio.* * Lua ```lua Space.Host.ExecutingObject.UIImage.PreserveAspect = true ``` ##### FillCenter[​](#fillcenter "Direct link to FillCenter") bool **FillCenter** `get` `set` *Whether or not to render the center* * Lua ```lua Space.Host.ExecutingObject.UIImage.FillCenter = true ``` ##### FillAmount[​](#fillamount "Direct link to FillAmount") float **FillAmount** `get` `set` *Amount of the Image shown* * Lua ```lua Space.Host.ExecutingObject.UIImage.FillAmount = 0.5 ``` ##### FillClockwise[​](#fillclockwise "Direct link to FillClockwise") bool **FillClockwise** `get` `set` *Whether the Image should be filled clockwise (true) or counter-clockwise (false).* * Lua ```lua Space.Host.ExecutingObject.UIImage.FillClockwise = true ``` ##### FillOrigin[​](#fillorigin "Direct link to FillOrigin") int **FillOrigin** `get` `set` *Controls the origin point of the Fill process.* * Lua ```lua Space.Host.ExecutingObject.UIImage.FillOrigin = 0 ``` ##### AlphaHitTestMinimumThreshold[​](#alphahittestminimumthreshold "Direct link to AlphaHitTestMinimumThreshold") float **AlphaHitTestMinimumThreshold** `get` `set` *The alpha threshold specifies the minimum alpha a pixel must have for the event to considered a "hit" on the Image. Alpha values less than the threshold will cause raycast events to pass through the Image. An value of 1 would cause only fully opaque pixels to register raycast events on the Image. The alpha tested is retrieved from the image sprite only, while the alpha of the Image Graphic.color is disregarded.* *alphaHitTestMinimumThreshold defaults to 0; all raycast events inside the Image rectangle are considered a hit. In order for greater than 0 to values to work, the sprite used by the Image must have readable pixels. This can be achieved by enabling Read/Write enabled in the advanced Texture Import Settings for the sprite and disabling atlassing for the sprite.* * Lua ```lua Space.Host.ExecutingObject.UIImage.AlphaHitTestMinimumThreshold = 0 ``` ##### HasBorder[​](#hasborder "Direct link to HasBorder") bool **HasBorder** `get` *True if the sprite used has borders.* * Lua ```lua imgHasBorder = Space.Host.ExecutingObject.UIImage.HasBorder ``` ##### PixelsPerUnit[​](#pixelsperunit "Direct link to PixelsPerUnit") float **PixelsPerUnit** `get` *Provides information about how fonts are scale to the screen.* *For dynamic fonts, the value is equivalent to the scale factor of the canvas. For non-dynamic fonts, the value is calculated from the requested text size and the size from the font.* * Lua ```lua ppUnit = Space.Host.ExecutingObject.UIImage.PixelsPerUnit ``` ##### Material[​](#material "Direct link to Material") [SMaterial](/scripting/client-scripting-api-reference/types/smaterial.md) **Material** `get` `set` *The specified Material used by this Image. The default Material is used instead if one wasn't specified.* * Lua ```lua Space.Host.ExecutingObject.UIImage.Material = Space.GetResource("resource name").AsMaterial ``` ##### MinWidth[​](#minwidth "Direct link to MinWidth") float **MinWidth** `get` *The minimum width this UIImage may be allocated. (Used by the Layout system).* * Lua ```lua minWidth = Space.Host.ExecutingObject.UIImage.MinWidth ``` ##### PreferredWidth[​](#preferredwidth "Direct link to PreferredWidth") float **PreferredWidth** `get` *The preferred width this UIImage should be allocated if there is sufficient space. (Used by the Layout system)* * Lua ```lua prefWidth = Space.Host.ExecutingObject.UIImage.PreferredWidth ``` ##### FlexibleWidth[​](#flexiblewidth "Direct link to FlexibleWidth") float **FlexibleWidth** `get` *The extra relative width this UIImage should be allocated if there is additional available space. (Used by the Layout system)* * Lua ```lua flexWidth = Space.Host.ExecutingObject.UIImage.FlexibleWidth ``` ##### MinHeight[​](#minheight "Direct link to MinHeight") float **MinHeight** `get` *The minimum height this UIImage may be allocated.(Used by the Layout system).* * Lua ```lua minHeight = Space.Host.ExecutingObject.UIImage.MinHeight ``` ##### PreferredHeight[​](#preferredheight "Direct link to PreferredHeight") float **PreferredHeight** `get` *The preferred height this UIImage should be allocated if there is sufficient space. (Used by the Layout system)* * Lua ```lua prefHeight = Space.Host.ExecutingObject.UIImage.PreferredHeight ``` ##### FlexibleHeight[​](#flexibleheight "Direct link to FlexibleHeight") float **FlexibleHeight** `get` *The extra relative height this UIImage should be allocated if there is additional available space. (Used by the Layout system)* * Lua ```lua flexHeight = Space.Host.ExecutingObject.UIImage.FlexibleHeight ``` ##### LayoutPriority[​](#layoutpriority "Direct link to LayoutPriority") int **LayoutPriority** `get` *The layout priority of this UIText component.(Used by the Layout system.)* * Lua ```lua layoutPrio = Space.Host.ExecutingObject.UIImage.LayoutPriority ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua ```lua theGameObject = Space.Host.ExecutingObject.UIImage.GameObject ``` --- ### SUIInputField #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | ---------------------------------------------------------------------------------------------------------------------------------- | | void [**OnValueChanged** ](/scripting/client-scripting-api-reference/components/suiinputfield.md#onvaluechanged)(Closure callback) | | void [**OnEndEdit** ](/scripting/client-scripting-api-reference/components/suiinputfield.md#onendedit)(Closure callback) | | void [**ActivateInputField** ](/scripting/client-scripting-api-reference/components/suiinputfield.md#activateinputfield)() | | void [**DeactivateInputField** ](/scripting/client-scripting-api-reference/components/suiinputfield.md#deactivateinputfield)() | | void [**Select** ](/scripting/client-scripting-api-reference/components/suiinputfield.md#select)() | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | -------------------------------------------------------------------------------------------------------------------------------------------- | | string [**Text** ](/scripting/client-scripting-api-reference/components/suiinputfield.md#text)`get` `set` | | bool [**Enabled** ](/scripting/client-scripting-api-reference/components/suiinputfield.md#enabled)`get` `set` | | bool [**Interactable** ](/scripting/client-scripting-api-reference/components/suiinputfield.md#interactable)`get` `set` | | bool [**IsFocused** ](/scripting/client-scripting-api-reference/components/suiinputfield.md#isfocused)`get` | | float [**CaretBlinkRate** ](/scripting/client-scripting-api-reference/components/suiinputfield.md#caretblinkrate)`get` `set` | | int [**CaretWidth** ](/scripting/client-scripting-api-reference/components/suiinputfield.md#caretwidth)`get` `set` | | int [**CharacterLimit** ](/scripting/client-scripting-api-reference/components/suiinputfield.md#characterlimit)`get` `set` | | bool [**ReadOnly** ](/scripting/client-scripting-api-reference/components/suiinputfield.md#readonly)`get` `set` | | bool [**MultiLine** ](/scripting/client-scripting-api-reference/components/suiinputfield.md#multiline)`get` | | char [**AsteriskChar** ](/scripting/client-scripting-api-reference/components/suiinputfield.md#asteriskchar)`get` `set` | | int [**CaretPosition** ](/scripting/client-scripting-api-reference/components/suiinputfield.md#caretposition)`get` `set` | | int [**SelectionAnchorPosition** ](/scripting/client-scripting-api-reference/components/suiinputfield.md#selectionanchorposition)`get` `set` | | int [**SelectionFocusPosition** ](/scripting/client-scripting-api-reference/components/suiinputfield.md#selectionfocusposition)`get` `set` | | float [**MinWidth** ](/scripting/client-scripting-api-reference/components/suiinputfield.md#minwidth)`get` | | float [**PreferredWidth** ](/scripting/client-scripting-api-reference/components/suiinputfield.md#preferredwidth)`get` | | float [**FlexibleWidth** ](/scripting/client-scripting-api-reference/components/suiinputfield.md#flexiblewidth)`get` | | float [**MinHeight** ](/scripting/client-scripting-api-reference/components/suiinputfield.md#minheight)`get` | | float [**PreferredHeight** ](/scripting/client-scripting-api-reference/components/suiinputfield.md#preferredheight)`get` | | float [**FlexibleHeight** ](/scripting/client-scripting-api-reference/components/suiinputfield.md#flexibleheight)`get` | | SColor [**NormalColor** ](/scripting/client-scripting-api-reference/components/suiinputfield.md#normalcolor)`get` `set` | | SColor [**HighlightedColor** ](/scripting/client-scripting-api-reference/components/suiinputfield.md#highlightedcolor)`get` `set` | | SColor [**PressedColor** ](/scripting/client-scripting-api-reference/components/suiinputfield.md#pressedcolor)`get` `set` | | SColor [**DisabledColor** ](/scripting/client-scripting-api-reference/components/suiinputfield.md#disabledcolor)`get` `set` | | float [**ColorMultiplier** ](/scripting/client-scripting-api-reference/components/suiinputfield.md#colormultiplier)`get` `set` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/suiinputfield.md#gameobject)`get` | #### Functions[​](#functions "Direct link to Functions") ##### OnValueChanged[​](#onvaluechanged "Direct link to OnValueChanged") void **OnValueChanged** (Closure callback) *Given function will be called when text in Input Field has changed* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua function OVC() -- end Space.Host.ExecutingObject.UIInputField.OnValueChanged(OVC) ``` * Lua ```lua --This script will make an input field update a text field --with character count in real-time every time a character is typed/removed --[Text field and Input fields need to be added as references (scripting runtime)] thisObject = Space.Host.ExecutingObject inputField = Space.Host.GetReference("The Input Field").UIInputField textField = Space.Host.GetReference("The Text Field").UIText OnValueChanged = function() textField.Text = "Count= " .. string.len(inputField.Text) end thisObject.UIInputField.OnValueChanged(OnValueChanged) ``` ##### OnEndEdit[​](#onendedit "Direct link to OnEndEdit") void **OnEndEdit** (Closure callback) *Given function will be called when editing has ended* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua function OEE() -- end Space.Host.ExecutingObject.UIInputField.OnEndEdit(OEE) ``` * Lua ```lua --This script will make an input field update a text field --as soon as someone has finished typing in it --Text field and Input fields need to be added as references (scripting runtime) thisObject = Space.Host.ExecutingObject inputField = Space.Host.GetReference("The Input Field").UIInputField textField = Space.Host.GetReference("The Text Field").UIText OnEndEdit = function() textField.Text = inputField.Text end Space.Host.ExecutingObject.UIInputField.OnEndEdit(OnEndEdit) ``` ##### ActivateInputField[​](#activateinputfield "Direct link to ActivateInputField") void **ActivateInputField** () *Function Description* * Lua ```lua Space.Host.ExecutingObject.UIInputField.ActivateInputField() ``` ##### DeactivateInputField[​](#deactivateinputfield "Direct link to DeactivateInputField") void **DeactivateInputField** () *Function Description* * Lua ```lua Space.Host.ExecutingObject.UIInputField.DeactivateInputField() ``` ##### Select[​](#select "Direct link to Select") void **Select** () *Function Description* * Lua ```lua Space.Host.ExecutingObject.UIInputField.DeactivateInputField() ``` #### Properties[​](#properties "Direct link to Properties") ##### Text[​](#text "Direct link to Text") string **Text** `get` `set` *The current value of the input field.* * Lua ```lua Space.Host.ExecutingObject.UIInputField.Text= "Hello" ``` * Lua ```lua --the below script makes this object set Browser URL according to what's written in text field --[Required: This object needs a Browser and InputField objects to be added as reference to references section in Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject webBrowser = Space.Host.GetReference("Browser") urlField = Space.Host.GetReference("URL Field") OnClick = function() webBrowser.Browser.SetURL = urlField.UIInputField.Text end urlField.UIInputField.Text = https://www.youtube.com thisGameObject.AddClickable() thisGameObject.Clickable.Tooltip = "Click to set URL" thisGameObject.Clickable.OnClick(OnClick) ``` ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` *Whether this Input Field component is Enabled* * Lua ```lua Space.Host.ExecutingObject.UIInputField.Enabled= true ``` * Lua ```lua --clicking this object will toggle a UIInputField's Enabled status thisGameObject = Space.Host.ExecutingObject inputfield = Space.Host.GetReference("inputfield").UIInputField --make sure to add this reference to the Scripting Runtime component OnClick = function() inputfield.Enabled = not inputfield.Enabled end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### Interactable[​](#interactable "Direct link to Interactable") bool **Interactable** `get` `set` *Is the Input Field interactable?* * Lua ```lua Space.Host.ExecutingObject.UIInputField.Interactable= true ``` * Lua ```lua --clicking this object will toggle a UIInputField's interactable status thisGameObject = Space.Host.ExecutingObject inputfield = Space.Host.GetReference("inputfield").UIInputField --make sure to add this reference to the Scripting Runtime component OnClick = function() inputfield.Interactable = not inputfield.Interactable end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### IsFocused[​](#isfocused "Direct link to IsFocused") bool **IsFocused** `get` *Does the InputField currently have focus and is able to process events.* * Lua ```lua hasFocus = Space.Host.ExecutingObject.UIInputField.IsFocused ``` ##### CaretBlinkRate[​](#caretblinkrate "Direct link to CaretBlinkRate") float **CaretBlinkRate** `get` `set` *The blinking rate of the input caret, defined as the number of times the blink cycle occurs per second.* * Lua ```lua Space.Host.ExecutingObject.UIInputField.CaretBlinkRate= 3 ``` ##### CaretWidth[​](#caretwidth "Direct link to CaretWidth") int **CaretWidth** `get` `set` *The width of the caret in pixels.* * Lua ```lua Space.Host.ExecutingObject.UIInputField.CaretWidth= 4 ``` ##### CharacterLimit[​](#characterlimit "Direct link to CharacterLimit") int **CharacterLimit** `get` `set` *Property Description* * Lua ```lua Space.Host.ExecutingObject.UIInputField.CharacterLimit= 8 ``` ##### ReadOnly[​](#readonly "Direct link to ReadOnly") bool **ReadOnly** `get` `set` *Property Description* * Lua ```lua Is the InputField read only? ``` * Lua ```lua --clicking this object will toggle a UIInputField's ReadOnly status thisGameObject = Space.Host.ExecutingObject inputfield = Space.Host.GetReference("inputfield").UIInputField --make sure to add this reference to the Scripting Runtime component OnClick = function() inputfield.ReadOnly = not inputfield.ReadOnly end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### MultiLine[​](#multiline "Direct link to MultiLine") bool **MultiLine** `get` *If the input field supports multiple lines.* * Lua ```lua Space.Host.ExecutingObject.UIInputField.MultiLine = true ``` ##### AsteriskChar[​](#asteriskchar "Direct link to AsteriskChar") char **AsteriskChar** `get` `set` *The character used for password fields.* * Lua ```lua Space.Host.ExecutingObject.UIInputField.AsteriskChar= "%" ``` ##### CaretPosition[​](#caretposition "Direct link to CaretPosition") int **CaretPosition** `get` `set` *Current InputField caret position (also selection tail).* * Lua ```lua Space.Host.ExecutingObject.UIInputField.CaretPosition= 3 ``` ##### SelectionAnchorPosition[​](#selectionanchorposition "Direct link to SelectionAnchorPosition") int **SelectionAnchorPosition** `get` `set` *The beginning point of the selection.* * Lua ```lua Space.Host.ExecutingObject.UIInputField.SelectionAnchorPosition= 1 ``` ##### SelectionFocusPosition[​](#selectionfocusposition "Direct link to SelectionFocusPosition") int **SelectionFocusPosition** `get` `set` *The end point of the selection.* * Lua ```lua Space.Host.ExecutingObject.UIInputField.SelectionFocusPosition= 4 ``` ##### MinWidth[​](#minwidth "Direct link to MinWidth") float **MinWidth** `get` *The minimum width this UIInputField may be allocated. (Used by the Layout system).* * Lua ```lua minWidth = Space.Host.ExecutingObject.UIInputField.MinWidth ``` ##### PreferredWidth[​](#preferredwidth "Direct link to PreferredWidth") float **PreferredWidth** `get` *The preferred width this UIInputField should be allocated if there is sufficient space. (Used by the Layout system)* * Lua ```lua prefWidth = Space.Host.ExecutingObject.UIInputField.PreferredWidth ``` ##### FlexibleWidth[​](#flexiblewidth "Direct link to FlexibleWidth") float **FlexibleWidth** `get` *The extra relative width this UIInputField should be allocated if there is additional available space. (Used by the Layout system)* * Lua ```lua flexWidth = Space.Host.ExecutingObject.UIInputField.FlexibleWidth ``` ##### MinHeight[​](#minheight "Direct link to MinHeight") float **MinHeight** `get` *The minimum height this UIInputField may be allocated.(Used by the Layout system).* * Lua ```lua minHeight = Space.Host.ExecutingObject.UIInputField.MinHeight ``` ##### PreferredHeight[​](#preferredheight "Direct link to PreferredHeight") float **PreferredHeight** `get` *The preferred height this UIInputField should be allocated if there is sufficient space. (Used by the Layout system)* * Lua ```lua prefHeight = Space.Host.ExecutingObject.UIInputField.PreferredHeight ``` ##### FlexibleHeight[​](#flexibleheight "Direct link to FlexibleHeight") float **FlexibleHeight** `get` *The extra relative height this UIInputField should be allocated if there is additional available space. (Used by the Layout system)* * Lua ```lua flexHeight = Space.Host.ExecutingObject.UIInputField.FlexibleHeight ``` ##### NormalColor[​](#normalcolor "Direct link to NormalColor") SColor **NormalColor** `get` `set` *The normal color.* * Lua ```lua Space.Host.ExecutingObject.UIInputField.NormalColor = Color.Red ``` ##### HighlightedColor[​](#highlightedcolor "Direct link to HighlightedColor") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **HighlightedColor** `get` `set` *The color of the control when it is highlighted.* * Lua ```lua Space.Host.ExecutingObject.UIInputField.HighlightedColor = Color.Red ``` ##### PressedColor[​](#pressedcolor "Direct link to PressedColor") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **PressedColor** `get` `set` *The color of the control when it is pressed.* * Lua ```lua Space.Host.ExecutingObject.UIInputField.PressedColor = Color.Red ``` ##### DisabledColor[​](#disabledcolor "Direct link to DisabledColor") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **DisabledColor** `get` `set` *The color of the control when it is disabled.* * Lua ```lua Space.Host.ExecutingObject.UIInputField.DisabledColor = Color.Red ``` ##### ColorMultiplier[​](#colormultiplier "Direct link to ColorMultiplier") float **ColorMultiplier** `get` `set` *This multiplies the tint color for each transition by its value.* * Lua ```lua Space.Host.ExecutingObject.UIInputField.ColorMultiplier = Color.Red ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua \`\`\` theGameObject = Space.Host.ExecutingObject.UIInputField.GameObject \`\`\` --- ### SUILayout #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | --------------------------------------------------------------------------------------------------------------------------------------- | | bool [**Enabled** ](/scripting/client-scripting-api-reference/components/suilayout.md#enabled)`get` `set` | | int [**PaddingLeft** ](/scripting/client-scripting-api-reference/components/suilayout.md#paddingleft)`get` `set` | | int [**PaddingRight** ](/scripting/client-scripting-api-reference/components/suilayout.md#paddingright)`get` `set` | | int [**PaddingTop** ](/scripting/client-scripting-api-reference/components/suilayout.md#paddingtop)`get` `set` | | int [**PaddingBottom** ](/scripting/client-scripting-api-reference/components/suilayout.md#paddingbottom)`get` `set` | | string [**ChildAlignment** ](/scripting/client-scripting-api-reference/components/suilayout.md#childalignment)`get` `set` | | float [**Spacing** ](/scripting/client-scripting-api-reference/components/suilayout.md#spacing)`get` `set` | | bool [**ChildControlHeight** ](/scripting/client-scripting-api-reference/components/suilayout.md#childcontrolheight)`get` `set` | | bool [**ChildControlWidth** ](/scripting/client-scripting-api-reference/components/suilayout.md#childcontrolwidth)`get` `set` | | bool [**ChildForceExpandHeight** ](/scripting/client-scripting-api-reference/components/suilayout.md#childforceexpandheight)`get` `set` | | bool [**ChildForceExpandWidth** ](/scripting/client-scripting-api-reference/components/suilayout.md#childforceexpandwidth)`get` `set` | | SVector [**GridCellSize** ](/scripting/client-scripting-api-reference/components/suilayout.md#gridcellsize)`get` `set` | | SVector [**GridSpacing** ](/scripting/client-scripting-api-reference/components/suilayout.md#gridspacing)`get` `set` | | int [**GridConstraintCount** ](/scripting/client-scripting-api-reference/components/suilayout.md#gridconstraintcount)`get` `set` | | string [**GridConstraint** ](/scripting/client-scripting-api-reference/components/suilayout.md#gridconstraintcount)`get` `set` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/suilayout.md#gameobject)`get` | #### Properties[​](#properties "Direct link to Properties") ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` *Is this UI layout component Enabled?* * Lua ```lua Space.Host.ExecutingObject.UILayout.Enabled = false ``` * Lua ```lua --clicking this object will toggle a Layout's Enabled status thisGameObject = Space.Host.ExecutingObject layout = Space.Host.GetReference("layout").UILayout --make sure to add this reference to the Scripting Runtime component OnClick = function() layout.Enabled= not layout.Enabled end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### PaddingLeft[​](#paddingleft "Direct link to PaddingLeft") int **PaddingLeft** `get` `set` *Space reserved for the left edge of the padding during the layout phase.* * Lua ```lua Space.Host.ExecutingObject.UILayout.PaddingLeft= 2 ``` ##### PaddingRight[​](#paddingright "Direct link to PaddingRight") int **PaddingRight** `get` `set` *Space reserved for the right edge of the padding during the layout phase.* * Lua ```lua Space.Host.ExecutingObject.UILayout.PaddingRight= 2 ``` ##### PaddingTop[​](#paddingtop "Direct link to PaddingTop") int **PaddingTop** `get` `set` *Space reserved for the top edge of the padding during the layout phase.* * Lua ```lua Space.Host.ExecutingObject.UILayout.PaddingTop= 2 ``` ##### PaddingBottom[​](#paddingbottom "Direct link to PaddingBottom") int **PaddingBottom** `get` `set` *Space reserved for the bottom edge of the padding during the layout phase.* * Lua ```lua Space.Host.ExecutingObject.UILayout.PaddingBottom= 2 ``` ##### ChildAlignment[​](#childalignment "Direct link to ChildAlignment") string **ChildAlignment** `get` `set` *Property Description* * Lua ```lua Space.Host.ExecutingObject.UILayout.ChildAlignment = "1" ``` ##### Spacing[​](#spacing "Direct link to Spacing") float **Spacing** `get` `set` *The spacing to use between layout elements in the layout group.* * Lua ```lua Space.Host.ExecutingObject.UILayout.Spacing= 2 ``` ##### ChildControlHeight[​](#childcontrolheight "Direct link to ChildControlHeight") bool **ChildControlHeight** `get` `set` *Returns true if the Layout Group controls the heights of its children. Returns false if children control their own heights.* *If set to false, the layout group will only affect the positions of the children while leaving the heights untouched. The heights of the children can be set via the respective RectTransforms in this case.* *If set to true, the heights of the children are automatically driven by the layout group according to their respective minimum, preferred, and flexible heights. This is useful if the heights of the children should change depending on how much space is available. In this case the height of each child cannot be set manually in the RectTransform, but the minimum, preferred and flexible height for each child can be controlled by adding a LayoutElement component to it.* * Lua ```lua Space.Host.ExecutingObject.UILayout.ChildControlHeight= true ``` ##### ChildControlWidth[​](#childcontrolwidth "Direct link to ChildControlWidth") bool **ChildControlWidth** `get` `set` *Returns true if the Layout Group controls the widths of its children. Returns false if children control their own widths.* *If set to false, the layout group will only affect the positions of the children while leaving the widths untouched. The widths of the children can be set via the respective RectTransforms in this case.* *If set to true, the widths of the children are automatically driven by the layout group according to their respective minimum, preferred, and flexible widths. This is useful if the widths of the children should change depending on how much space is available. In this case the width of each child cannot be set manually in the RectTransform, but the minimum, preferred and flexible width for each child can be controlled by adding a LayoutElement component to it.* * Lua ```lua Space.Host.ExecutingObject.UILayout.ChildControlWidth= false ``` ##### ChildForceExpandHeight[​](#childforceexpandheight "Direct link to ChildForceExpandHeight") bool **ChildForceExpandHeight** `get` `set` *Whether to force the children to expand to fill additional available vertical space.* * Lua ```lua Space.Host.ExecutingObject.UILayout.ChildForceExpandHeight= false ``` ##### ChildForceExpandWidth[​](#childforceexpandwidth "Direct link to ChildForceExpandWidth") bool **ChildForceExpandWidth** `get` `set` *Whether to force the children to expand to fill additional available horizontal space.* * Lua ```lua Space.Host.ExecutingObject.UILayout.ChildForceExpandWidth= false ``` ##### GridCellSize[​](#gridcellsize "Direct link to GridCellSize") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **GridCellSize** `get` `set` *The size to use for each cell in the grid.* * Lua ```lua Space.Host.ExecutingObject.UILayout.GridCellSize= Vector.New(1,1,0) ``` ##### GridSpacing[​](#gridspacing "Direct link to GridSpacing") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **GridSpacing** `get` `set` *The spacing to use between layout elements in the grid.* * Lua ```lua Space.Host.ExecutingObject.UILayout.GridSpacing= Vector.New(1,1,0) ``` ##### GridConstraintCount[​](#gridconstraintcount "Direct link to GridConstraintCount") int **GridConstraintCount** `get` `set` *How many cells there should be along the constrained axis.* * Lua ```lua Space.Host.ExecutingObject.UILayout.GridConstraintCount= 2 ``` ##### GridConstraint[​](#gridconstraint "Direct link to GridConstraint") string **GridConstraint** `get` `set` *Property Description* * Lua ```lua Space.Host.ExecutingObject.UILayout.GridConstraint = 1 ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua ```lua theGameObject = Space.Host.ExecutingObject.UILayout.GridConstraint ``` --- ### SUIRawImage #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ----------------------------------------------------------------------------------------------------------------------- | | bool [**RaycastTarget** ](/scripting/client-scripting-api-reference/components/suirawimage.md#raycasttarget)`get` `set` | | bool [**Maskable** ](/scripting/client-scripting-api-reference/components/suirawimage.md#maskable)`get` `set` | | SResource [**Texture** ](/scripting/client-scripting-api-reference/components/suirawimage.md#texture)`get` `set` | | SColor [**Color** ](/scripting/client-scripting-api-reference/components/suirawimage.md#color)`get` `set` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/suirawimage.md#gameobject)`get` | #### Properties[​](#properties "Direct link to Properties") ##### RaycastTarget[​](#raycasttarget "Direct link to RaycastTarget") bool **RaycastTarget** `get` `set` *Enable Raycast Target.* * Lua ```lua Space.Host.ExecutingObject.UIRawImage.RaycastTarget = true ``` ##### Maskable[​](#maskable "Direct link to Maskable") bool **Maskable** `get` `set` *To check if the graphic is maskable.* * Lua ```lua Space.Host.ExecutingObject.UIRawImage.Maskable = true ``` ##### Texture[​](#texture "Direct link to Texture") [SResource](/scripting/client-scripting-api-reference/types/sresource.md) **Texture** `get` `set` *The RawImage's texture.* * Lua ```lua Space.Host.ExecutingObject.UIRawImage.Texture = Space.GetResource("Resource Name") ``` ##### Color[​](#color "Direct link to Color") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **Color** `get` `set` *Base color of the Graphic.* * Lua ```lua Space.Host.ExecutingObject.UIRawImage.Color = Color.Red ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua ```lua theGameObject = Space.Host.ExecutingObject.UIRawImage.GameObject ``` --- ### SUIScrollbar #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | --------------------------------------------------------------------------------------------------------------------------------- | | void [**OnValueChanged** ](/scripting/client-scripting-api-reference/components/suiscrollbar.md#onvaluechanged)(Closure callback) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | -------------------------------------------------------------------------------------------------------------------------------- | | float [**Size** ](/scripting/client-scripting-api-reference/components/suiscrollbar.md#size)`get` `set` | | float [**Value** ](/scripting/client-scripting-api-reference/components/suiscrollbar.md#value)`get` `set` | | int [**NumberOfSteps** ](/scripting/client-scripting-api-reference/components/suiscrollbar.md#numberofsteps)`get` `set` | | SColor [**NormalColor** ](/scripting/client-scripting-api-reference/components/suiscrollbar.md#normalcolor)`get` `set` | | SColor [**HighlightedColor** ](/scripting/client-scripting-api-reference/components/suiscrollbar.md#highlightedcolor)`get` `set` | | SColor [**PressedColor** ](/scripting/client-scripting-api-reference/components/suiscrollbar.md#pressedcolor)`get` `set` | | SColor [**DisabledColor** ](/scripting/client-scripting-api-reference/components/suiscrollbar.md#disabledcolor)`get` `set` | | float [**ColorMultiplier** ](/scripting/client-scripting-api-reference/components/suiscrollbar.md#colormultiplier)`get` `set` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/suiscrollbar.md#gameobject)`get` | ##### OnValueChanged[​](#onvaluechanged "Direct link to OnValueChanged") void **OnValueChanged** (Closure callback) *Handling for when the scrollbar value is changed.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua function OCV() -- end Space.Host.ExecutingObject.UIScrollbar.OnValueChanged(OCV) ``` #### Properties[​](#properties "Direct link to Properties") ##### Size[​](#size "Direct link to Size") float **Size** `get` `set` *The size of the scrollbar handle where 1 means it fills the entire scrollbar.* * Lua ```lua Space.Host.ExecutingObject.UIScrollbar.Size = 0.1 ``` ##### Value[​](#value "Direct link to Value") float **Value** `get` `set` *The current value of the scrollbar, between 0 and 1.* * Lua ```lua Space.Host.ExecutingObject.UIScrollbar.Value = 0.5 ``` ##### NumberOfSteps[​](#numberofsteps "Direct link to NumberOfSteps") int **NumberOfSteps** `get` `set` *Property Description* * Lua ```lua Space.Host.ExecutingObject.UIScrollbar.NumberOfSteps = 2 ``` ##### NormalColor[​](#normalcolor "Direct link to NormalColor") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **NormalColor** `get` `set` *Property Description* * Lua ```lua Space.Host.ExecutingObject.UIScrollbar.NormalColor = Color.Red ``` ##### HighlightedColor[​](#highlightedcolor "Direct link to HighlightedColor") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **HighlightedColor** `get` `set` *Property Description* * Lua ```lua Space.Host.ExecutingObject.UIScrollbar.HighlightedColor = Color.Red ``` ##### PressedColor[​](#pressedcolor "Direct link to PressedColor") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **PressedColor** `get` `set` *Property Description* * Lua ```lua Space.Host.ExecutingObject.UIScrollbar.PressedColor = Color.Red ``` ##### DisabledColor[​](#disabledcolor "Direct link to DisabledColor") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **DisabledColor** `get` `set` *Property Description* * Lua ```lua Space.Host.ExecutingObject.UIScrollbar.DisabledColor = Color.Red ``` ##### ColorMultiplier[​](#colormultiplier "Direct link to ColorMultiplier") float **ColorMultiplier** `get` `set` *Property Description* * Lua ```lua Space.Host.ExecutingObject.UIScrollbar.ColorMultiplier = Color.Red ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua ```lua theGameObject = Space.Host.ExecutingObject.UIScrollbar.GameObject ``` --- ### SUISlider #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | ------------------------------------------------------------------------------------------------------------------------------ | | void [**OnValueChanged** ](/scripting/client-scripting-api-reference/components/suislider.md#onvaluechanged)(Closure callback) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ----------------------------------------------------------------------------------------------------------------------------- | | bool [**Enabled** ](/scripting/client-scripting-api-reference/components/suislider.md#enabled)`get` `set` | | bool [**Interactable** ](/scripting/client-scripting-api-reference/components/suislider.md#interactable)`get` `set` | | int [**Direction** ](/scripting/client-scripting-api-reference/components/suislider.md#direction)`get` `set` | | float [**MinValue** ](/scripting/client-scripting-api-reference/components/suislider.md#minvalue)`get` `set` | | float [**MaxValue** ](/scripting/client-scripting-api-reference/components/suislider.md#maxvalue)`get` `set` | | bool [**WholeNumbers** ](/scripting/client-scripting-api-reference/components/suislider.md#wholenumbers)`get` `set` | | float [**Value** ](/scripting/client-scripting-api-reference/components/suislider.md#value)`get` `set` | | float [**NormalizedValue** ](/scripting/client-scripting-api-reference/components/suislider.md#normalizedvalue)`get` `set` | | SColor [**NormalColor** ](/scripting/client-scripting-api-reference/components/suislider.md#normalcolor)`get` `set` | | SColor [**HighlightedColor** ](/scripting/client-scripting-api-reference/components/suislider.md#highlightedcolor)`get` `set` | | SColor [**PressedColor** ](/scripting/client-scripting-api-reference/components/suislider.md#pressedcolor)`get` `set` | | SColor [**DisabledColor** ](/scripting/client-scripting-api-reference/components/suislider.md#disabledcolor)`get` `set` | | float [**ColorMultiplier** ](/scripting/client-scripting-api-reference/components/suislider.md#colormultiplier)`get` `set` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/suislider.md#gameobject)`get` | #### Functions[​](#functions "Direct link to Functions") ##### OnValueChanged[​](#onvaluechanged "Direct link to OnValueChanged") void **OnValueChanged** (Closure callback) *Callback executed when the value of the slider is changed.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua function ValueChanged() -- end Space.Host.ExecutingObject.UISlider.OnValueChanged(ValueChanged) ``` * Lua ```lua --This script will make moving a slider control the Master Volume --and also update a text field with the current Master Volume --[You need to add the slider and text field as a reference] slider = Space.Host.GetReference("Slider").UISlider textField = Space.Host.GetReference("Text Field").UIText OnValueChanged = function() Space.UI.MasterVolume = slider.NormalizedValue * 100 textField.Text = Space.UI.MasterVolume end slider.OnValueChanged(OnValueChanged) ``` #### Properties[​](#properties "Direct link to Properties") ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` *Whether this Slider component is Enabled or not* * Lua ```lua Space.Host.ExecutingObject.UISlider.Enabled = false ``` * Lua ```lua --clicking this object will toggle a Sliders's Enabled status thisGameObject = Space.Host.ExecutingObject slider = Space.Host.GetReference("slider").UISlider --make sure to add this reference to the Scripting Runtime component OnClick = function() slider.Enabled = not slider.Enabled end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### Interactable[​](#interactable "Direct link to Interactable") bool **Interactable** `get` `set` *Use to enable or disable the ability to interact with the slider.* * Lua ```lua Space.Host.ExecutingObject.UISlider.Interactable = true ``` * Lua ```lua --clicking this object will toggle a Sliders's Interactable status thisGameObject = Space.Host.ExecutingObject slider = Space.Host.GetReference("slider").UISlider --make sure to add this reference to the Scripting Runtime component OnClick = function() slider.Interactable = not slider.Interactable end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### Direction[​](#direction "Direct link to Direction") int **Direction** `get` `set` *The direction of the slider (0 to 4). 0 Left To Right, 1 Right To Left, 2 Bottom To Top, 3 Top To Bottom* * Lua ```lua Space.Host.ExecutingObject.UISlider.Direction = 1 ``` ##### MinValue[​](#minvalue "Direct link to MinValue") float **MinValue** `get` `set` *The minimum allowed value of the slider.* * Lua ```lua Space.Host.ExecutingObject.UISlider.MinValue = 10 ``` ##### MaxValue[​](#maxvalue "Direct link to MaxValue") float **MaxValue** `get` `set` *The maximum allowed value of the slider.* * Lua ```lua Space.Host.ExecutingObject.UISlider.MaxValue = 20 ``` ##### WholeNumbers[​](#wholenumbers "Direct link to WholeNumbers") bool **WholeNumbers** `get` `set` *Should the value only be allowed to be whole numbers?* * Lua ```lua Space.Host.ExecutingObject.UISlider.WholeNumbers = true ``` * Lua ```lua --clicking this object will toggle a Sliders's Whole Numbers status thisGameObject = Space.Host.ExecutingObject slider = Space.Host.GetReference("slider").UISlider --make sure to add this reference to the Scripting Runtime component OnClick = function() slider.WholeNumbers = not slider.WholeNumbers end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### Value[​](#value "Direct link to Value") float **Value** `get` `set` *The current value of the slider.* * Lua ```lua Space.Host.ExecutingObject.UISlider.Value = 20 ``` ##### NormalizedValue[​](#normalizedvalue "Direct link to NormalizedValue") float **NormalizedValue** `get` `set` *The current value of the slider normalized into a value between 0 and 1.* * Lua ```lua Space.Host.ExecutingObject.UISlider.NormalizedValue = 0.5 ``` * Lua ```lua --This script will make moving a slider control the Master Volume --and also update a text field with the current Master Volume --(example: custom UI) --[You need to add the slider and text field as a reference] slider = Space.Host.GetReference("Slider").UISlider textField = Space.Host.GetReference("Text Field").UIText OnValueChanged = function() Space.UI.MasterVolume = slider.NormalizedValue * 100 textField.Text = Space.UI.MasterVolume end slider.OnValueChanged(OnValueChanged) ``` ##### NormalColor[​](#normalcolor "Direct link to NormalColor") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **NormalColor** `get` `set` *The normal color.* * Lua ```lua Space.Host.ExecutingObject.UISlider.NormalColor = Color.Red ``` ##### HighlightedColor[​](#highlightedcolor "Direct link to HighlightedColor") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **HighlightedColor** `get` `set` *The color of the control when it is highlighted.* * Lua ```lua Space.Host.ExecutingObject.UISlider.HighlightedColor = Color.Red ``` ##### PressedColor[​](#pressedcolor "Direct link to PressedColor") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **PressedColor** `get` `set` *The color of the control when it is pressed.* * Lua \`\`\` Space.Host.ExecutingObject.UISlider.PressedColor = Color.Red \`\`\` ##### DisabledColor[​](#disabledcolor "Direct link to DisabledColor") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **DisabledColor** `get` `set` *The color of the control when it is disabled.* * Lua ```lua lSpace.Host.ExecutingObject.UISlider.DisabledColor = Color.Red ``` ##### ColorMultiplier[​](#colormultiplier "Direct link to ColorMultiplier") float **ColorMultiplier** `get` `set` *This multiplies the tint color for each transition by its value.* * Lua ```lua Space.Host.ExecutingObject.UISlider.ColorMultiplier = 1.2 ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua ```lua theGameObject = Space.Host.ExecutingObject.UISlider.GameObject ``` --- ### SUIText #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | --------------------------------------------------------------------------------------------------------------------------------- | | bool [**SupportRichText** ](/scripting/client-scripting-api-reference/components/suitext.md#supportrichtext)`get` `set` | | bool [**ResizeTextForBestFit** ](/scripting/client-scripting-api-reference/components/suitext.md#resizetextforbestfit)`get` `set` | | int [**ResizeTextMinSize** ](/scripting/client-scripting-api-reference/components/suitext.md#resizetextminsize)`get` `set` | | int [**ResizeTextMaxSize** ](/scripting/client-scripting-api-reference/components/suitext.md#resizetextmaxsize)`get` `set` | | bool [**AlignByGeometry** ](/scripting/client-scripting-api-reference/components/suitext.md#alignbygeometry)`get` `set` | | int [**FontSize** ](/scripting/client-scripting-api-reference/components/suitext.md#fontsize)`get` `set` | | float [**LineSpacing** ](/scripting/client-scripting-api-reference/components/suitext.md#linespacing)`get` `set` | | float [**PixelsPerUnit** ](/scripting/client-scripting-api-reference/components/suitext.md#pixelsperunit)`get` | | float [**MinWidth** ](/scripting/client-scripting-api-reference/components/suitext.md#minwidth)`get` | | float [**PreferredWidth** ](/scripting/client-scripting-api-reference/components/suitext.md#preferredwidth)`get` | | float [**FlexibleWidth** ](/scripting/client-scripting-api-reference/components/suitext.md#flexiblewidth)`get` | | float [**MinHeight** ](/scripting/client-scripting-api-reference/components/suitext.md#minheight)`get` | | float [**PreferredHeight** ](/scripting/client-scripting-api-reference/components/suitext.md#preferredheight)`get` | | float [**FlexibleHeight** ](/scripting/client-scripting-api-reference/components/suitext.md#flexibleheight)`get` | | int [**LayoutPriority** ](/scripting/client-scripting-api-reference/components/suitext.md#layoutpriority)`get` | | bool [**Enabled** ](/scripting/client-scripting-api-reference/components/suitext.md#enabled)`get` `set` | | string [**Text** ](/scripting/client-scripting-api-reference/components/suitext.md#text)`get` `set` | | SColor [**Color** ](/scripting/client-scripting-api-reference/components/suitext.md#color)`get` `set` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/suitext.md#gameobject)`get` | #### Properties[​](#properties "Direct link to Properties") ##### SupportRichText[​](#supportrichtext "Direct link to SupportRichText") bool **SupportRichText** `get` `set` *Whether this Text will support rich text.* * Lua ```lua Space.Host.ExecutingObject.UIText.SupportRichText = true ``` * Lua ```lua --the below script will make a UIToggle disable/enable Rich Text support in the UIText --[Add "toggle" and "text" references to the Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject toggle = Space.Host.GetReference("toggle").UIToggle text = Space.Host.GetReference("text").UIText text.Text = " Bold Test " OVC = function() if toggle.IsOn then text.SupportRichText = true else text.SupportRichText = false end end toggle.OnValueChanged(OVC) ``` ##### ResizeTextForBestFit[​](#resizetextforbestfit "Direct link to ResizeTextForBestFit") bool **ResizeTextForBestFit** `get` `set` *Should the text be allowed to auto resized.* * Lua ```lua Space.Host.ExecutingObject.UIText.ResizeTextForBestFit = false ``` * Lua ```lua --the below script will make a UIToggle disable/enable the Best Fit feature in the UIText --[Add "toggle" and "text" references to the Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject toggle = Space.Host.GetReference("toggle").UIToggle text = Space.Host.GetReference("text").UIText text.Text = "A very long text a very long text a very long text a very long text" OVC = function() if toggle.IsOn then text.ResizeTextForBestFit = true else text.ResizeTextForBestFit = false end end toggle.OnValueChanged(OVC) ``` ##### ResizeTextMinSize[​](#resizetextminsize "Direct link to ResizeTextMinSize") int **ResizeTextMinSize** `get` `set` *The minimum size the text is allowed to be.* * Lua ```lua Space.Host.ExecutingObject.UIText.ResizeTextMinSize = 20 ``` * Lua ```lua --the below script will make a slider change the UIText's Best Fit Min Size --[Add "slider" and "text" references to the Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject slider = Space.Host.GetReference("slider").UISlider text = Space.Host.GetReference("text").UIText text.Text = "Best Fit Min Size" text.ResizeTextForBestFit = true OVC = function() text.ResizeTextMinSize = (slider.Value * 20) + 10 -- from 10 to 30 end slider.OnValueChanged(OVC) ``` ##### ResizeTextMaxSize[​](#resizetextmaxsize "Direct link to ResizeTextMaxSize") int **ResizeTextMaxSize** `get` `set` *The maximum size the text is allowed to be.* * Lua ```lua Space.Host.ExecutingObject.UIText.ResizeTextMaxSize = 150 ``` * Lua ```lua --the below script will make a slider change the UIText's Best Fit Max Size --[Add "slider" and "text" references to the Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject slider = Space.Host.GetReference("slider").UISlider text = Space.Host.GetReference("text").UIText text.Text = "Best Fit Max Size" text.ResizeTextForBestFit = true OVC = function() text.ResizeTextMaxSize = (slider.Value * 50) + 20 -- from 50 to 70 end slider.OnValueChanged(OVC) ``` ##### AlignByGeometry[​](#alignbygeometry "Direct link to AlignByGeometry") bool **AlignByGeometry** `get` `set` *Use the range of glyph geometry to perform horizontal alignment.* * Lua ```lua Space.Host.ExecutingObject.UIText.AlignByGeometry = true ``` * Lua ```lua --the below script will make a UIToggle disable/enable the Align By Geometry feature in the UIText --[Add "toggle" and "text" references to the Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject toggle = Space.Host.GetReference("toggle").UIToggle text = Space.Host.GetReference("text").UIText text.Text = "Align By Geometry" OVC = function() if toggle.IsOn then text.AlignByGeometry = true else text.AlignByGeometry = false end end toggle.OnValueChanged(OVC) ``` ##### FontSize[​](#fontsize "Direct link to FontSize") int **FontSize** `get` `set` *The size that the Font should render at.* * Lua ```lua Space.Host.ExecutingObject.UIText.FontSize = 54 ``` * Lua ```lua --the below script will make a slider change the UIText's Font Size --[Add "slider" and "text" references to the Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject slider = Space.Host.GetReference("slider").UISlider text = Space.Host.GetReference("text").UIText text.Text = "Text Size Test" OVC = function() text.FontSize = (slider.Value * 40) + 10 -- from 10 to 50 end slider.OnValueChanged(OVC) ``` ##### LineSpacing[​](#linespacing "Direct link to LineSpacing") float **LineSpacing** `get` `set` *How much space will be in-between lines of text. This is a multiplier. The line spacing value set will be multiplied by the font's internal line spacing. A value of 1 will produce normal line spacing.* * Lua ```lua thisObject = Space.Host.ExecutingObject.UIText.LineSpacing = 2 ``` * Lua ```lua --the below script will make a slider change the UIText's Line Spacing --[Add "slider" and "text" references to the Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject slider = Space.Host.GetReference("slider").UISlider text = Space.Host.GetReference("text").UIText text.Text = "Line Spacing Line Spacing Line Spacing Line Spacing Line Spacing" OVC = function() text.LineSpacing = (slider.Value * 2) -- from 0 to 2 end slider.OnValueChanged(OVC) ``` ##### PixelsPerUnit[​](#pixelsperunit "Direct link to PixelsPerUnit") float **PixelsPerUnit** `get` *Provides information about how fonts are scale to the screen.* *For dynamic fonts, the value is equivalent to the scale factor of the canvas. For non-dynamic fonts, the value is calculated from the requested text size and the size from the font.* * Lua ```lua thisObject = Space.Host.ExecutingObject --get a reference to our object thisObjectText = thisObject.UIText --get a reference to the UIText component in our object Space.Log(thisObjectText.PixelsPerUnit) --Prints the PixelsPerUnit value of this UIText component to the console ``` ##### MinWidth[​](#minwidth "Direct link to MinWidth") float **MinWidth** `get` *The minimum width this UIText may be allocated. (Used by the Layout system).* * Lua ```lua thisObject = Space.Host.ExecutingObject --get a reference to our object thisObjectText = thisObject.UIText --get a reference to the UIText component in our object Space.Log(thisObjectText.MinWidth) --Prints the MinWidth value of this UIText component to the console ``` ##### PreferredWidth[​](#preferredwidth "Direct link to PreferredWidth") float **PreferredWidth** `get` *The preferred width this UIText should be allocated if there is sufficient space. (Used by the Layout system)* * Lua ```lua pWidth = Space.Host.ExecutingObject.UIText.PreferredWidth ``` ##### FlexibleWidth[​](#flexiblewidth "Direct link to FlexibleWidth") float **FlexibleWidth** `get` *The extra relative width this UIText should be allocated if there is additional available space. (Used by the Layout system)* * Lua ```lua FlexibleWidth = Space.Host.ExecutingObject.UIText.FlexibleWidth ``` ##### MinHeight[​](#minheight "Direct link to MinHeight") float **MinHeight** `get` *The minimum height this UIText may be allocated.(Used by the Layout system).* * Lua ```lua minHeight = Space.Host.ExecutingObject.UIText.MinHeight ``` ##### PreferredHeight[​](#preferredheight "Direct link to PreferredHeight") float **PreferredHeight** `get` *The preferred height this UIText should be allocated if there is sufficient space. (Used by the Layout system)* * Lua ```lua pHeight = Space.Host.ExecutingObject.UIText.PreferredHeight ``` ##### FlexibleHeight[​](#flexibleheight "Direct link to FlexibleHeight") float **FlexibleHeight** `get` *The extra relative height this UIText should be allocated if there is additional available space. (Used by the Layout system.)* * Lua ```lua FlexibleHeight = Space.Host.ExecutingObject.UIText.FlexibleHeight ``` ##### LayoutPriority[​](#layoutpriority "Direct link to LayoutPriority") int **LayoutPriority** `get` *The layout priority of this UIText component.(Used by the Layout system.)* * Lua ```lua layoutPriority = Space.Host.ExecutingObject.UIText.LayoutPriority ``` ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` *Whether the UIText component is Enabled or not will decide if it is visually updating or not.* * Lua ```lua Space.Host.ExecutingObject.UIText.Enabled = true ``` * Lua ```lua --this below script will make clicking this object disable/enable a UIText component thisGameObject = Space.Host.ExecutingObject text = Space.Host.GetReference("text").UIText OnClick = function() if text.Enabled then text.Enabled = false else text.Enabled = true end end thisGameObject.AddClickable() thisGameObject.Clickable.Tooltip = "click to hide/show text" thisGameObject.Clickable.OnClick(OnClick) ``` ##### Text[​](#text "Direct link to Text") string **Text** `get` `set` *The string value this Text displays.* * Lua ```lua Space.Host.ExecutingObject.UIText.Text = "Hello World!" ``` * Lua ```lua --the below script will make a UIText element with this script --constantly update itself to show the local time --(Example: UI Text element that shows local clock) --[This object needs to be a UI Text object. In Unity, Heirarchy -> Create -> UI -> Text] -- thisGameObject = Space.Host.ExecutingObject OnUpdate = function() thisGameObject.UIText.Text = Space.LocalTime end thisGameObject.SubscribeToEvents() thisGameObject.OnUpdate(OnUpdate) ``` ##### Color[​](#color "Direct link to Color") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **Color** `get` `set` *Base color of the Graphic.* * Lua ```lua Space.Host.ExecutingObject.UIText.Color = Color.Red ``` * Lua ```lua --This script dynamically changes the text's color of a GameObject with UIText component. --For example in a text sign over your shop that you want to make more visually stand out --or perhaps text decoration during a celebration or a text element in your User Interface or HUD. thisObject = Space.Host.ExecutingObject --get a reference to our object thisObjectText = thisObject.UIText --get a reference to the SUIText component in our object colors = {Color.Red, Color.Black, Color.White, Color.Blue, Color.Green, Color.Yellow} --here we are holding 6 predefined colors in a Lua Table which we will go through function ColorChanger() while true do --infinite loop for i=1,#colors do --For Loop to cycle through all the table items thisObjectText.color = colors[i] --this will set the color based on which item in the table we are now at coroutine.yield(0.1) --this will pause for a tenth of a second before we change to the next color end end end Space.Host.StartCoroutine(ColorChanger) --this coroutine will now call our ColorChanger() function which is infinitely changing our text colors between a select range. ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua ```lua theGameObject = Space.Host.ExecutingObject.UIText.Text ``` --- ### SUIToggle #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | ------------------------------------------------------------------------------------------------------------------------------ | | void [**OnValueChanged** ](/scripting/client-scripting-api-reference/components/suitoggle.md#onvaluechanged)(Closure callback) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ----------------------------------------------------------------------------------------------------------------------------- | | bool [**Enabled** ](/scripting/client-scripting-api-reference/components/suitoggle.md#enabled)`get` `set` | | bool [**Interactable** ](/scripting/client-scripting-api-reference/components/suitoggle.md#interactable)`get` `set` | | bool [**IsOn** ](/scripting/client-scripting-api-reference/components/suitoggle.md#ison)`get` `set` | | SColor [**NormalColor** ](/scripting/client-scripting-api-reference/components/suitoggle.md#normalcolor)`get` `set` | | SColor [**HighlightedColor** ](/scripting/client-scripting-api-reference/components/suitoggle.md#highlightedcolor)`get` `set` | | SColor [**PressedColor** ](/scripting/client-scripting-api-reference/components/suitoggle.md#pressedcolor)`get` `set` | | SColor [**DisabledColor** ](/scripting/client-scripting-api-reference/components/suitoggle.md#disabledcolor)`get` `set` | | float [**ColorMultiplier** ](/scripting/client-scripting-api-reference/components/suitoggle.md#colormultiplier)`get` `set` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/suitoggle.md#gameobject)`get` | #### Functions[​](#functions "Direct link to Functions") ##### OnValueChanged[​](#onvaluechanged "Direct link to OnValueChanged") void **OnValueChanged** (Closure callback) *Binds a function to be triggered when value of the UIToggle changes.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua function ovc() -- end Space.Host.ExecutingObject.UIToggle.OnValueChanged(ovc) ``` * Lua ```lua --This script will make a UI Toggle show/hide the Notification Button --[You need to add an object with UI Toggle as a reference (scripting runtime)] toggle = Space.Host.GetReference("Toggle").UIToggle OnValueChanged = function() if toggle.IsOn then Space.UI.ShowNotificationButton= true else Space.UI.ShowNotificationButton= false end end toggle.OnValueChanged(OnValueChanged) ``` #### Properties[​](#properties "Direct link to Properties") ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` *Whether the UIToggle is Enabled* * Lua ```lua Space.Host.ExecutingObject.UIToggle.Enabled = true ``` * Lua ```lua --clicking this object will toggle a Toggles's Enabled status thisGameObject = Space.Host.ExecutingObject toggle = Space.Host.GetReference("toggle").UIToggle --make sure to add this reference to the Scripting Runtime component OnClick = function() toggle.Enabled = not toggle.Enabled end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### Interactable[​](#interactable "Direct link to Interactable") bool **Interactable** `get` `set` *Whether the UIToggle is Interactable* * Lua ```lua Space.Host.ExecutingObject.UIToggle.Interactable = true ``` * Lua ```lua --clicking this object will toggle a Toggles's Interactable status thisGameObject = Space.Host.ExecutingObject toggle = Space.Host.GetReference("toggle").UIToggle --make sure to add this reference to the Scripting Runtime component OnClick = function() toggle.Interactable= not toggle.Interactable end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### IsOn[​](#ison "Direct link to IsOn") bool **IsOn** `get` `set` *Whether the UIToggle is toggled On* * Lua ```lua Space.Host.ExecutingObject.UIToggle.IsOn = true ``` * Lua ```lua --This script will make a UI Toggle show/hide the Notification Button --[You need to add an object with UI Toggle as a reference (scripting runtime)] toggle = Space.Host.GetReference("Toggle").UIToggle OnValueChanged = function() if toggle.IsOn then Space.UI.ShowNotificationButton= true else Space.UI.ShowNotificationButton= false end end toggle.OnValueChanged(OnValueChanged) ``` ##### NormalColor[​](#normalcolor "Direct link to NormalColor") SColor **NormalColor** `get` `set` *The normal color.* * Lua ```lua Space.Host.ExecutingObject.UIToggle.NormalColor = Color.Red ``` ##### HighlightedColor[​](#highlightedcolor "Direct link to HighlightedColor") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **HighlightedColor** `get` `set` *The color of the control when it is highlighted.* * Lua ```lua Space.Host.ExecutingObject.UIToggle.HighlightedColor = Color.Red ``` ##### PressedColor[​](#pressedcolor "Direct link to PressedColor") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **PressedColor** `get` `set` *The color of the control when it is pressed.* * Lua ```lua Space.Host.ExecutingObject.UIToggle.PressedColor = Color.Red ``` ##### DisabledColor[​](#disabledcolor "Direct link to DisabledColor") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **DisabledColor** `get` `set` *The color of the control when it is disabled.* * Lua ```lua Space.Host.ExecutingObject.UIToggle.DisabledColor = Color.Red ``` ##### ColorMultiplier[​](#colormultiplier "Direct link to ColorMultiplier") float **ColorMultiplier** `get` `set` *This multiplies the tint color for each transition by its value.* * Lua ```lua Space.Host.ExecutingObject.UIToggle.ColorMultiplier = 1.2 ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua ```lua theGameObject = Space.Host.ExecutingObject.UIToggle.GameObject ``` --- ### SUIToolTipHint #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | --------------------------------------------------------------------------------------------------------------------- | | bool [**Enabled** ](/scripting/client-scripting-api-reference/components/suitooltiphint.md#enabled)`get` `set` | | string [**Text** ](/scripting/client-scripting-api-reference/components/suitooltiphint.md#text)`get` `set` | | SResource [**Texture** ](/scripting/client-scripting-api-reference/components/suitooltiphint.md#texture)`get` `set` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/suitooltiphint.md#gameobject)`get` | #### Properties[​](#properties "Direct link to Properties") ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` *Get or set whether the tool tip component is Enabled.* * Lua ```lua Space.Host.ExecutingObject.UIToolTipHint.Enabled = true ``` ##### Text[​](#text "Direct link to Text") string **Text** `get` `set` *Get or set the string value this tool tip displays.* * Lua ```lua Space.Host.ExecutingObject.UIToolTipHint.Text = "AToolTip" ``` ##### Texture[​](#texture "Direct link to Texture") [SResource](/scripting/client-scripting-api-reference/types/sresource.md) **Texture** `get` `set` *Get or set the tooltip's texture.* * Lua ```lua Space.Host.ExecutingObject.UIToolTipHint.Texture = Space.GetResource("ResourceName") ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua ```lua theGameObject = Space.Host.ExecutingObject.UIToolTipHint.GameObject ``` --- ### SVirtualCamera #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | --------------------------------------------------------------------------------------------------------------------------------- | | bool [**Enabled** ](/scripting/client-scripting-api-reference/components/svirtualcamera.md#enabled)`get` `set` | | float [**FieldOfView** ](/scripting/client-scripting-api-reference/components/svirtualcamera.md#fieldofview)`get` `set` | | float [**Dutch** ](/scripting/client-scripting-api-reference/components/svirtualcamera.md#dutch)`get` `set` | | float [**NearClip** ](/scripting/client-scripting-api-reference/components/svirtualcamera.md#nearclip)`get` `set` | | float [**FarClip** ](/scripting/client-scripting-api-reference/components/svirtualcamera.md#farclip)`get` `set` | | float [**OrthographicSize** ](/scripting/client-scripting-api-reference/components/svirtualcamera.md#orthographicsize)`get` `set` | | int [**Priority** ](/scripting/client-scripting-api-reference/components/svirtualcamera.md#priority)`get` `set` | | SGameObject [**Follow** ](/scripting/client-scripting-api-reference/components/svirtualcamera.md#follow)`get` `set` | | SGameObject [**LookAt** ](/scripting/client-scripting-api-reference/components/svirtualcamera.md#lookat)`get` `set` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/svirtualcamera.md#gameobject)`get` | #### Properties[​](#properties "Direct link to Properties") ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` *Is this virtual camera enabled?* * Lua ```lua Space.Host.ExecutingObject.VirtualCamera.Enabled = true ``` * Lua ```lua --clicking this object will Enable/Disable it's Virtual Camera component thisGameObject = Space.Host.ExecutingObject component = thisGameObject.VirtualCamera OnClick = function() component.Enabled = not component.Enabled end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### FieldOfView[​](#fieldofview "Direct link to FieldOfView") float **FieldOfView** `get` `set` *Field of view of this virtual camera.* * Lua ```lua Space.Host.ExecutingObject.VirtualCamera.FieldOfView = 50.0 ``` ##### Dutch[​](#dutch "Direct link to Dutch") float **Dutch** `get` `set` *Dutch of view of this virtual camera. In degrees.* * Lua ```lua Space.Host.ExecutingObject.VirtualCamera.Dutch = 50.0 ``` ##### NearClip[​](#nearclip "Direct link to NearClip") float **NearClip** `get` `set` *The near clip plane of this virtual camera.* * Lua ```lua Space.Host.ExecutingObject.VirtualCamera.NearClip = 50.0 ``` ##### FarClip[​](#farclip "Direct link to FarClip") float **FarClip** `get` `set` *The far clip plane of this virtual camera.* * Lua ```lua Space.Host.ExecutingObject.VirtualCamera.FarClip = 50.0 ``` ##### OrthographicSize[​](#orthographicsize "Direct link to OrthographicSize") float **OrthographicSize** `get` `set` *The orthographic size of this virtual camera.* * Lua ```lua Space.Host.ExecutingObject.VirtualCamera.OrthographicSize = 10.0 ``` ##### Priority[​](#priority "Direct link to Priority") int **Priority** `get` `set` *The priority of this virtual camera. Higher priority cameras will be used over lower priority cameras when conflicted.* * Lua ```lua Space.Host.ExecutingObject.VirtualCamera.Priority = 500 ``` ##### Follow[​](#follow "Direct link to Follow") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **Follow** `get` `set` *The object that this virtual camera should be following.* * Lua ```lua AReferenceToGameObject = Space.Host.GetReference("Reference Name") Space.Host.ExecutingObject.VirtualCamera.Follow = AReferenceToGameObject ``` ##### LookAt[​](#lookat "Direct link to LookAt") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **LookAt** `get` `set` *The object that this virtual camera should be looking at.* * Lua ```lua AReferenceToGameObject = Space.Host.GetReference("Reference Name") Space.Host.ExecutingObject.VirtualCamera.LookAt = AReferenceToGameObject ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua ```lua theGameObject = Space.Host.ExecutingObject.VirtualCamera.GameObject ``` --- ### SVoiceZone #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | ------------------------------------------------------------------------------------------------------------------------------------ | | void [**SetOverrideVoice** ](/scripting/client-scripting-api-reference/components/svoicezone.md#setoverridevoice)(bool enabled) | | void [**ClearOverrideVoice** ](/scripting/client-scripting-api-reference/components/svoicezone.md#clearoverridevoice)() | | void [**SetOverrideVideo** ](/scripting/client-scripting-api-reference/components/svoicezone.md#setoverridevideo)(bool enabled) | | void [**ClearOverrideVideo** ](/scripting/client-scripting-api-reference/components/svoicezone.md#clearoverridevideo)() | | void [**AddAuthVoiceUser** ](/scripting/client-scripting-api-reference/components/svoicezone.md#addauthvoiceuser)(uint userID) | | void [**RemoveAuthVoiceUser** ](/scripting/client-scripting-api-reference/components/svoicezone.md#removeauthvoiceuser)(uint userID) | | void [**AddAuthVideoUser** ](/scripting/client-scripting-api-reference/components/svoicezone.md#addauthvideouser)(uint userID) | | void [**RemoveAuthVideoUser** ](/scripting/client-scripting-api-reference/components/svoicezone.md#removeauthvideouser)(uint userID) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ---------------------------------------------------------------------------------------------------------------------------------- | | bool [**Enabled** ](/scripting/client-scripting-api-reference/components/svoicezone.md#enabled)`get` `set` | | bool [**AllowVoice** ](/scripting/client-scripting-api-reference/components/svoicezone.md#allowvoice)`get` `set` | | bool [**AllowVideo** ](/scripting/client-scripting-api-reference/components/svoicezone.md#allowvideo)`get` `set` | | bool [**ConnectVoiceService** ](/scripting/client-scripting-api-reference/components/svoicezone.md#connectvoiceservice)`get` `set` | | bool [**ConnectVideoService** ](/scripting/client-scripting-api-reference/components/svoicezone.md#connectvideoservice)`get` `set` | | int [**Priority** ](/scripting/client-scripting-api-reference/components/svoicezone.md#priority)`get` | | string [**AreaName** ](/scripting/client-scripting-api-reference/components/svoicezone.md#areaname)`get` | | bool [**Spatialized** ](/scripting/client-scripting-api-reference/components/svoicezone.md#spatialized)`get` | | bool [**SpatialDropoff** ](/scripting/client-scripting-api-reference/components/svoicezone.md#spatialdropoff)`get` | | bool [**SpatialStereo** ](/scripting/client-scripting-api-reference/components/svoicezone.md#spatialstereo)`get` | | float [**SpatialDistance** ](/scripting/client-scripting-api-reference/components/svoicezone.md#spatialdistance)`get` | | bool [**Global** ](/scripting/client-scripting-api-reference/components/svoicezone.md#global)`get` | | uint\[] [**AuthVideoUsers** ](/scripting/client-scripting-api-reference/components/svoicezone.md#authvideousers)`get` | | uint\[] [**AuthVoiceUsers** ](/scripting/client-scripting-api-reference/components/svoicezone.md#authvoiceusers)`get` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/components/svoicezone.md#gameobject)`get` | #### Functions[​](#functions "Direct link to Functions") ##### SetOverrideVoice[​](#setoverridevoice "Direct link to SetOverrideVoice") void **SetOverrideVoice** (bool enabled) *Set voice to override the original voice.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.VoiceZone.SetOverrideVoice(true) ``` ##### ClearOverrideVoice[​](#clearoverridevoice "Direct link to ClearOverrideVoice") void **ClearOverrideVoice** () *Clear the overriding voice.* * Lua ```lua Space.Host.ExecutingObject.VoiceZone.ClearOverrideVoice() ``` ##### SetOverrideVideo[​](#setoverridevideo "Direct link to SetOverrideVideo") void **SetOverrideVideo** (bool enabled) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.VoiceZone.SetOverrideVideo(true) ``` ##### ClearOverrideVideo[​](#clearoverridevideo "Direct link to ClearOverrideVideo") void **ClearOverrideVideo** () *Function Description* * Lua ```lua Space.Host.ExecutingObject.VoiceZone.SetOverrideVideo(true) ``` ##### AddAuthVoiceUser[​](#addauthvoiceuser "Direct link to AddAuthVoiceUser") void **AddAuthVoiceUser** (uint userID) *Add a user to AuthVoiceUser by his ID.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.VoiceZone.AddAuthVoiceUser(000000000) ``` ##### RemoveAuthVoiceUser[​](#removeauthvoiceuser "Direct link to RemoveAuthVoiceUser") void **RemoveAuthVoiceUser** (uint userID) *Remove a user from AuthVoiceUser by his ID.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua lSpace.Host.ExecutingObject.VoiceZone.RemoveAuthVoiceUser(000000000) ``` ##### AddAuthVideoUser[​](#addauthvideouser "Direct link to AddAuthVideoUser") void **AddAuthVideoUser** (uint userID) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.VoiceZone.AddAuthVideoUser(000000000) ``` ##### RemoveAuthVideoUser[​](#removeauthvideouser "Direct link to RemoveAuthVideoUser") void **RemoveAuthVideoUser** (uint userID) *Remove a user from AuthVoiceUser by his ID.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.VoiceZone.RemoveAuthVideoUser(000000000) ``` #### Properties[​](#properties "Direct link to Properties") ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` *Whether the Voice Zone component is Enabled* * Lua ```lua Space.Host.ExecutingObject.VoiceZone.Enabled = true ``` * Lua ```lua --clicking this object will Enable/Disable it's Voice Zone component thisGameObject = Space.Host.ExecutingObject component = thisGameObject.VoiceZone OnClick = function() component.Enabled = not component.Enabled end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### AllowVoice[​](#allowvoice "Direct link to AllowVoice") bool **AllowVoice** `get` `set` *Whether allows voice.* * Lua ```lua Space.Host.ExecutingObject.VoiceZone.AllowVoice = true ``` ##### AllowVideo[​](#allowvideo "Direct link to AllowVideo") bool **AllowVideo** `get` `set` *Whether allows video.* * Lua ```lua Space.Host.ExecutingObject.VoiceZone.AllowVideo = true ``` ##### ConnectVoiceService[​](#connectvoiceservice "Direct link to ConnectVoiceService") bool **ConnectVoiceService** `get` `set` *Property Description* * Lua ```lua Space.Host.ExecutingObject.VoiceZone.ConnectVoiceService = true ``` ##### ConnectVideoService[​](#connectvideoservice "Direct link to ConnectVideoService") bool **ConnectVideoService** `get` `set` *Property Description* * Lua ```lua Space.Host.ExecutingObject.VoiceZone.ConnectVideoService = true ``` ##### Priority[​](#priority "Direct link to Priority") int **Priority** `get` *The priority of the voice zone* * Lua ```lua priority = Space.Host.ExecutingObject.VoiceZone.Priority ``` ##### AreaName[​](#areaname "Direct link to AreaName") string **AreaName** `get` *The name of area.* * Lua ```lua priority = Space.Host.ExecutingObject.VoiceZone.AreaName ``` ##### Spatialized[​](#spatialized "Direct link to Spatialized") bool **Spatialized** `get` *Whether the voice zone is spatialized.* * Lua ```lua isSpatialized = Space.Host.ExecutingObject.VoiceZone.Spatialized ``` ##### SpatialDropoff[​](#spatialdropoff "Direct link to SpatialDropoff") bool **SpatialDropoff** `get` *Whether the voice zone is spatialized drop off.* * Lua ```lua spatialDropoff = Space.Host.ExecutingObject.VoiceZone.SpatialDropoff ``` ##### SpatialStereo[​](#spatialstereo "Direct link to SpatialStereo") bool **SpatialStereo** `get` *Whether the voice zone is spatial stereo.* * Lua ```lua spatialStereo = Space.Host.ExecutingObject.VoiceZone.SpatialStereo ``` ##### SpatialDistance[​](#spatialdistance "Direct link to SpatialDistance") float **SpatialDistance** `get` *The spatial distance of the voice zone.* * Lua ```lua floatDistance = Space.Host.ExecutingObject.VoiceZone.SpatialDistance ``` ##### Global[​](#global "Direct link to Global") bool **Global** `get` *Whether the voice zone is global.* * Lua ```lua isGlobal = Space.Host.ExecutingObject.VoiceZone.Global ``` ##### AuthVideoUsers[​](#authvideousers "Direct link to AuthVideoUsers") uint\[] **AuthVideoUsers** `get` *Return an array of auth video user.* * Lua ```lua tableAuthVideoUsers = Space.Host.ExecutingObject.VoiceZone.AuthVideoUsers ``` ##### AuthVoiceUsers[​](#authvoiceusers "Direct link to AuthVoiceUsers") uint\[] **AuthVoiceUsers** `get` *Property Description* * Lua ```lua tableAuthVideoUsers = Space.Host.ExecutingObject.VoiceZone.AuthVoiceUsers ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua ```lua theGameObject = Space.Host.ExecutingObject.VoiceZone.GameObject ``` --- ### Network Networking APIs for client scripts, covering chat, network messages between peers, web requests, and shared photo and video resources. --- ### SChat #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | -------------------------------------------------------------------------------------------------------------------------------------------------- | | void [**OnChat** ](schat#onchat)(Closure callback)
void [**OnChat** ](schat#onchat)(Action< SChatMessage > trackInfoCallback) | | void [**JoinChat** ](/scripting/client-scripting-api-reference/network/schat.md#joinchat)(string name) | | string [**GetXMPPName** ](/scripting/client-scripting-api-reference/network/schat.md#getxmppname)(string name) | | void [**LeaveChat** ](/scripting/client-scripting-api-reference/network/schat.md#leavechat)(string name) | | SVoiceZone [**GetVoiceZone** ](/scripting/client-scripting-api-reference/network/schat.md#getvoicezone)(string channel) | | void [**JoinVoice** ](/scripting/client-scripting-api-reference/network/schat.md#joinvoice)(string channel, int priority=5, int spatial=0) | | void [**JoinGridVoice** ](/scripting/client-scripting-api-reference/network/schat.md#joingridvoice)(string channel, int priority=5, int spatial=0) | | void [**LeaveVoice** ](/scripting/client-scripting-api-reference/network/schat.md#leavevoice)(string channel) | #### Functions[​](#functions "Direct link to Functions") ##### OnChat[​](#onchat "Direct link to OnChat") void **OnChat** (Closure callback)
void **OnChat** (Action< [SChatMessage](/scripting/client-scripting-api-reference/types/schatmessage.md) > trackInfoCallback) *Bind a function to the OnChat event. This function will be called every time a new chat message is received on the local channel.* | Parameter | Type | Description | | --------- | -------------------------------- | --------------------------------------- | | callback | Closure or Action\ | Invoked when a chat message is received | * Lua ```lua Space.Network.Chat.OnChat(OnChatFunction) ``` * Lua ```lua --this script takes every new chat message and displays it in a UIText uiText = Space.Host.GetReference("text").UIText --Add this Text object as reference in Scripting Runtime OnChatFunction = function(SChatMessage) uiText.Text = SChatMessage.Sender ..": " .. SChatMessage.Message end Space.Network.Chat.OnChat(OnChatFunction) ``` ##### JoinChat[​](#joinchat "Direct link to JoinChat") void **JoinChat** (string name) *Join a chat channel.* | Parameter | Type | Description | | --------- | ------ | -------------------- | | name | string | Chat channel to join | * Lua ```lua Space.Network.Chat.JoinChat("Test room") ``` * Lua ```lua --this script will make the player join a chat when entering a trigger collider and leave it when leaving --[Requires this object to have a "Trigger" collider] thisObject = Space.Host.ExecutingObject thisPlayer = Space.Scene.PlayerAvatar OTS = function(gameObject) if gameObject.Avatar ~= nil and thisPlayer == gameObject.Avatar then Space.Network.Chat.JoinChat("PrivateChatZone") end end OTE = function(gameObject) if gameObject.Avatar ~= nil and thisPlayer == gameObject.Avatar then Space.Network.Chat.LeaveChat("PrivateChatZone") end end thisObject.OnTriggerStart(OTS) thisObject.OnTriggerExit(OTE) ``` ##### GetXMPPName[​](#getxmppname "Direct link to GetXMPPName") string **GetXMPPName** (string name) *Get XMPP name.* | Parameter | Type | Description | | --------- | ------ | ------------------------ | | name | string | Human-readable chat name | * Lua ```lua Space.Network.Chat.GetXMPPName("Test room") ``` ##### LeaveChat[​](#leavechat "Direct link to LeaveChat") void **LeaveChat** (string name) *Leave a chat channel.* | Parameter | Type | Description | | --------- | ------ | --------------------- | | name | string | Chat channel to leave | * Lua ```lua Space.Network.Chat.LeaveChat("Test room") ``` * Lua ```lua --this script will make the player join a chat when entering a trigger collider and leave it when leaving --[Requires this object to have a "Trigger" collider] thisObject = Space.Host.ExecutingObject thisPlayer = Space.Scene.PlayerAvatar OTS = function(gameObject) if gameObject.Avatar ~= nil and thisPlayer == gameObject.Avatar then Space.Network.Chat.JoinChat("PrivateChatZone") end end OTE = function(gameObject) if gameObject.Avatar ~= nil and thisPlayer == gameObject.Avatar then Space.Network.Chat.LeaveChat("PrivateChatZone") end end thisObject.OnTriggerStart(OTS) thisObject.OnTriggerExit(OTE) ``` ##### GetVoiceZone[​](#getvoicezone "Direct link to GetVoiceZone") SVoiceZone **GetVoiceZone** (string channel) *Get a reference to a voice zone component for the given channel.* | Parameter | Type | Description | | --------- | ------ | ------------------------- | | channel | string | Voice channel name/handle | * Lua ```lua voiceZone = Space.Network.Chat.GetVoiceZone("AChannel") ``` ##### JoinVoice[​](#joinvoice "Direct link to JoinVoice") void **JoinVoice** (string channel, int priority=5, int spatial=0) *Join a voice chat channel.* | Parameter | Type | Description | | --------- | ------ | ---------------------------------------------- | | channel | string | Voice channel name/handle | | priority | int | Optional. Priority, default 5 | | spatial | int | Optional. Spatialization flag (0/1), default 0 | * Lua ```lua Space.Network.Chat.JoinVoice("PrivateVoiceZone") ``` * Lua ```lua --this script will make the player join a voice channel when entering a trigger collider and leave it when leaving --[Requires this object to have a "Trigger" collider] thisObject = Space.Host.ExecutingObject thisPlayer = Space.Scene.PlayerAvatar OTS = function(gameObject) if gameObject.Avatar ~= nil and thisPlayer == gameObject.Avatar then Space.Network.Chat.JoinVoice("PrivateVoiceZone") end end OTE = function(gameObject) if gameObject.Avatar ~= nil and thisPlayer == gameObject.Avatar then Space.Network.Chat.LeaveVoice("PrivateVoiceZone") end end thisObject.OnTriggerStart(OTS) thisObject.OnTriggerExit(OTE) ``` ##### JoinGridVoice[​](#joingridvoice "Direct link to JoinGridVoice") void **JoinGridVoice** (string channel, int priority=5, int spatial=0) *JoinGridVoice is the same as JoinVoice except with a grid wide parameter. (white-label only)* | Parameter | Type | Description | | --------- | ------ | ---------------------------------------------- | | channel | string | Voice channel name/handle (grid-wide) | | priority | int | Optional. Priority, default 5 | | spatial | int | Optional. Spatialization flag (0/1), default 0 | * Lua ```lua Space.Network.Chat.JoinGridVoice("PrivateGridVoiceZone") ``` * Lua ```lua --this script will make the player join a Grid voice channel when entering a trigger collider and leave it when leaving --[Requires this object to have a "Trigger" collider] thisObject = Space.Host.ExecutingObject thisPlayer = Space.Scene.PlayerAvatar OTS = function(gameObject) if gameObject.Avatar ~= nil and thisPlayer == gameObject.Avatar then Space.Network.Chat.JoinGridVoice("PrivateGridVoiceZone") end end OTE = function(gameObject) if gameObject.Avatar ~= nil and thisPlayer == gameObject.Avatar then Space.Network.Chat.LeaveVoice("PrivateGridVoiceZone") end end thisObject.OnTriggerStart(OTS) thisObject.OnTriggerExit(OTE) ``` ##### LeaveVoice[​](#leavevoice "Direct link to LeaveVoice") void **LeaveVoice** (string channel) *Leave a voice chat channel* | Parameter | Type | Description | | --------- | ------ | ---------------------- | | channel | string | Voice channel to leave | * Lua ```lua Space.Network.Chat.LeaveVoice("PrivateVoiceZone") ``` * Lua ```lua --this script will make the player join a voice channel when entering a trigger collider and leave it when leaving --[Requires this object to have a "Trigger" collider] thisObject = Space.Host.ExecutingObject thisPlayer = Space.Scene.PlayerAvatar OTS = function(gameObject) if gameObject.Avatar ~= nil and thisPlayer == gameObject.Avatar then Space.Network.Chat.JoinVoice("PrivateVoiceZone") end end OTE = function(gameObject) if gameObject.Avatar ~= nil and thisPlayer == gameObject.Avatar then Space.Network.Chat.LeaveVoice("PrivateVoiceZone") end end thisObject.OnTriggerStart(OTS) thisObject.OnTriggerExit(OTE) ``` --- ### SNetwork #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | void [**SendNetworkMessage** ](snetwork#sendnetworkmessage)(string key, Table message, bool serverOnly, bool loopback)
void [**SendNetworkMessage** ](snetwork#sendnetworkmessage)(string key, Table message, bool serverOnly)
void [**SendNetworkMessage** ](snetwork#sendnetworkmessage)(string key, Table message) | | void[ **SendNetworkMessageToUser**](/scripting/client-scripting-api-reference/network/snetwork.md#sendnetworkmessagetouser) (string key, Table message, uint userID) | | void [**SubscribeToRegionPropertyUpdate**](/scripting/client-scripting-api-reference/network/snetwork.md#subscribetoregionpropertyupdate) (string key, DynValue onRecieve) | | void [**SubscribeToNetwork** ](/scripting/client-scripting-api-reference/network/snetwork.md#subscribetonetwork)(string key, DynValue onRecieve) | | void [**SetRegionProperty** ](/scripting/client-scripting-api-reference/network/snetwork.md#setregionproperty)(string key, string value) | | string [**GetRegionProperty** ](/scripting/client-scripting-api-reference/network/snetwork.md#getregionproperty)(string key) | | void [**SetShardProperty** ](/scripting/client-scripting-api-reference/network/snetwork.md#setshardproperty)(string key, string value) | | string [**GetShardProperty** ](/scripting/client-scripting-api-reference/network/snetwork.md#getshardproperty)(string key) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | Description | | --------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | bool [**HasShardProperties** ](/scripting/client-scripting-api-reference/network/snetwork.md#hasshardproperties)`get` | Returns True upon successful connection to the Region/Shard properties' storage. Region/Shard property operations may not be ready when used during initialization and this function will help determine readiness. | #### Overview[​](#overview "Direct link to Overview") * Local network messages (region/shard scope) * Use SendNetworkMessage / SubscribeToNetwork with a string key. * Delivery is confined to the current region or shard and only to active subscribers of that key. * Payload is a Lua Table (dictionary) of network-serializable types. Messages are ephemeral and not stored. * Region/Shard properties (server-stored) * Use SetRegionProperty/GetRegionProperty for region-scoped semi-permanent storage (persists while the region is open). * Use SetShardProperty/GetShardProperty for shard-scoped storage (persists until the shard shuts down or all users leave). * Values are strings; operations may be rate-limited and may not be immediately available on join. Use HasShardProperties to detect readiness. #### Functions[​](#functions "Direct link to Functions") ##### SendNetworkMessage[​](#sendnetworkmessage "Direct link to SendNetworkMessage") void **SendNetworkMessage** (string key, Table message) void **SendNetworkMessage** (string key, Table message, bool serverOnly) void **SendNetworkMessage** (string key, Table message, bool serverOnly, bool loopback) *Sends a networked message to every client with a subscriber listening on 'key'. The message itself can be a table/dictionary of network-serializable types (string, float, int, byte, bool and arrays of those types). Requests may be rate limited.* | Parameter | Type | Description | | ---------- | ------ | -------------------------------------------------------------- | | key | string | Subscription key to route the message to listeners | | message | Table | Table/dictionary of serializable values | | serverOnly | bool | Optional. If true, send via server only | | loopback | bool | Optional. If true, also invoke local subscriber on this client | * Lua ```lua Space.Network.SendNetworkMessage('AKey', {first = "xyz", second= "abc"}) --or Space.Network.SendNetworkMessage('AKey', {first = "xyz", second= "abc"}, true) --or Space.Network.SendNetworkMessage('AKey', {first = "xyz", second= "abc"}, true, true) ``` * Lua ```lua image = "mrlee.jpg" server = "https://middleware.systems/" obj = Space.Host.GetReference("Gino") Space.Network.SubscribeToNetwork("smack", onSmack) function hithere() resrc = Space.WebServices.GetImage(server .. image) obj.Renderer.Material.SetTexture("_MainTex", resrc) Space.Network.SendNetworkMessage("smack",{'smack'}) end function update() resrc = Space.WebServices.GetImage(server .. image) obj.Renderer.Material.SetTexture("_MainTex", resrc) end function onSmack() update() end ``` ##### SendNetworkMessageToUser[​](#sendnetworkmessagetouser "Direct link to SendNetworkMessageToUser") void **SendNetworkMessageToUser** (string key, Table message, uint userID) *Sends a networked message to a specific user (userID) with a subscriber listening on 'key'.* | Parameter | Type | Description | | --------- | ------ | --------------------------------------- | | key | string | Subscription key | | message | Table | Table/dictionary of serializable values | | userID | uint | Target user ID | * Lua ```lua Space.Network.SendNetworkMessageToUser('AKey', {first = "xyz", second= "abc"}, 23123123) ``` ##### SubscribeToRegionPropertyUpdate[​](#subscribetoregionpropertyupdate "Direct link to SubscribeToRegionPropertyUpdate") void **SubscribeToRegionPropertyUpdate** (string key, DynValue onRecieve) *Subscribes to region property updates on 'key'.* | Parameter | Type | Description | | --------- | ---------------- | ---------------------------------------------------------------------------------------------------- | | key | string | Property key to subscribe to | | onRecieve | Callback Closure | onRecieve(NetworkPropertyUpdate) will be called on updates. NetworkPropertyUpdate = { Key, Message } | * Lua ```lua function onRecieve(NetworkPropertyUpdate) propertyKey = NetworkPropertyUpdate.Key propertyValue = NetworkPropertyUpdate.Message end Space.Network.SubscribeToRegionPropertyUpdate('A Key', onRecieve) ``` ##### SubscribeToNetwork[​](#subscribetonetwork "Direct link to SubscribeToNetwork") void **SubscribeToNetwork** (string key, Action< [SNetworkMessageLua ](#)> onRecieve)
void **SubscribeToNetwork** (string key, DynValue onRecieve) *Subscribes to network messages on 'key', will fire a SNetworkMessage whenever a matching message is received* | Parameter | Type | Description | | --------- | ---------------- | ---------------------------------------------------------------------------------- | | key | string | Subscription key to listen on | | onRecieve | Callback Closure | Callback receiving SNetworkMessageLua with fields Key (string) and Message (Table) | * Lua ```lua function OnRecieveFunction(SNetworkMessageLua) -- end Space.Network.SubscribeToNetwork("AKey", OnRecieveFunction) ``` * Lua ```lua local scriptedObject = Space.Host.ExecutingObject; local textValue = Space.Host.GetReference("Text"); scriptedObject.SubscribeToEvents(); -- This function gets used by other objects that are subscribed to the network gotAMessage = function(arguments) textValue.UIText.Text = "Got a message with the argument " .. arguments.Message["someArgument"]; end -- This function gets used by "this" object. Plus, it sends out a message to objects on the network. local updateTextUI = function() textValue.UIText.Text = "Got a message with the argument Hi there!"; Space.Network.SendNetworkMessage("helloworld", {someArgument = "Hi there!"}); end -- Subscribe to network. Note that "this" object doesn't execute gotAMessage. -- Only the other objects on the network do. Space.Network.SubscribeToNetwork("helloworld", gotAMessage); scriptedObject.OnMouseDown(updateTextUI); -- "Text" used with GetReference is a UItext canvas object used to display the test text inworld. After you add UI > Text to your scene, drag the text object to the Object References section in your script. ``` ##### SetRegionProperty[​](#setregionproperty "Direct link to SetRegionProperty") void **SetRegionProperty** (string key, string value) *Stores a key/value pair in the Regions semi-permanent memory. Will be erased when all players exit the region, but will persist as long as the region is open. Subject to rate limiting (10/second on the main grid and 20/second on white-label grids)* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Network.SetRegionProperty("testKey", "Test Value") ``` * Lua ```lua --this script is a networked and persistent color changing of an object --note that we put the object's GlobalID in the key to make it specific to this object thisObject = Space.Host.ExecutingObject currentColor = nil OnClick = function() --this writes to the region properties if currentColor == Color.Blue then Space.Network.SetRegionProperty(thisObject.GlobalID .. "color", "red") else Space.Network.SetRegionProperty(thisObject.GlobalID .. "color", "blue") end end Sync = function() -- this gets from the region properties while true do local result = Space.Network.GetRegionProperty(thisObject.GlobalID .. "color") if result == "red" then currentColor = Color.Red else currentColor = Color.Blue end thisObject.Renderer.Material.SetColor("_Color", currentColor) coroutine.yield(0.1) --to make sure it doesn't run more than 12/second end end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) Space.Host.StartCoroutine(Sync) ``` ##### GetRegionProperty[​](#getregionproperty "Direct link to GetRegionProperty") string **GetRegionProperty** (string key) *Retrieves the last set value for 'key' in this region. If you have just joined the region, this may not be populated immedietely.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua result = Space.Network.GetRegionProperty("testKey") ``` * Lua ```lua --this script is a networked and persistent color changing of an object --note that we put the object's GlobalID in the key to make it specific to this object thisObject = Space.Host.ExecutingObject currentColor = nil OnClick = function() --this writes to the region properties if currentColor == Color.Blue then Space.Network.SetRegionProperty(thisObject.GlobalID .. "color", "red") else Space.Network.SetRegionProperty(thisObject.GlobalID .. "color", "blue") end end Sync = function() -- this gets from the region properties while true do local result = Space.Network.GetRegionProperty(thisObject.GlobalID .. "color") if result == "red" then currentColor = Color.Red else currentColor = Color.Blue end thisObject.Renderer.Material.SetColor("_Color", currentColor) coroutine.yield(0.1) --to make sure it doesn't run more than 12/second end end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) Space.Host.StartCoroutine(Sync) ``` ##### SetShardProperty[​](#setshardproperty "Direct link to SetShardProperty") void **SetShardProperty** (string key, string value) *Sets a property named 'key' of the Shard to 'value'. Will persist until the Shard is shut down or restarted. (Use SPersistence for longer term storage)* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local scriptedObject = Space.Host.ExecutingObject; scriptedObject.SubscribeToEvents(); local testMsg = "Hello"; local updateTextUI = function() Space.Network.SetShardProperty("testKey", testMsg); end scriptedObject.OnMouseDown(updateTextUI); ``` ##### GetShardProperty[​](#getshardproperty "Direct link to GetShardProperty") string **GetShardProperty** (string key) *Gets a previously set key.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local scriptedObject = Space.Host.ExecutingObject; scriptedObject.SubscribeToEvents(); local textValue = Space.Host.GetReference("Text"); local retrieved; local updateTextUI = function() retrieved = Space.Network.GetShardProperty("testKey"); end -- this method is called every frame, once "retrieved" gets a value, it displays in text local onUpdateMethod = function() updateTextUI(); if retrieved ~= nil then textValue.UIText.Text = "Retrieved msg: " .. retrieved ; end end scriptedObject.OnUpdate(onUpdateMethod); ``` #### Properties[​](#properties "Direct link to Properties") ##### HasShardProperties[​](#hasshardproperties "Direct link to HasShardProperties") bool **HasShardProperties** `get` *Returns True upon successful connection to the Region/Shard properties' storage. Region/Shard property operations may not be ready when used during initialization and this function ill help determine readiness.* * Lua ```lua IsReady = Space.Network.HasShardProperties ``` * Lua ```lua --This script starts but launches a coroutine that waits for HasShardProperties before continuing DoWhatYouNeed = function(result) if property == nil or property == "" then Space.Log("connected but Shard doesn't exist") else Space.Log("connected and Shard exists. Result: " .. tostring(result)) end end InitCoroutine = function() while not Space.Network.HasShardProperties do coroutine.yield(0) end local property = Space.Network.GetRegionProperty("A Key") DoWhatYouNeed(property) end Space.Host.StartCoroutine(InitCoroutine) ``` --- ### SNetworkMessageLua #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ---------------------------------------------------------------------------------------------------------- | | string [**Key** ](/scripting/client-scripting-api-reference/network/snetworkmessagelua.md#key)`get` | | Table [**Message** ](/scripting/client-scripting-api-reference/network/snetworkmessagelua.md#message)`get` | #### Properties[​](#properties "Direct link to Properties") ##### Key[​](#key "Direct link to Key") string **Key** `get` *The Key this message was sent with.* * Lua ```lua function OnReceiveFunction(receivedMessage) local theKey = receivedMessage.Key end Space.Network.SubscribeToNetwork("AKey", OnReceiveFunction) ``` ##### Message[​](#message "Direct link to Message") Table **Message** `get` *The contents of this message.* * Lua ```lua function OnReceiveFunction(receivedMessage) local tableMessage = receivedMessage.Message end Space.Network.SubscribeToNetwork("AKey", OnReceiveFunction) ``` --- ### SPhotos #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | ------------------------------------------------------------------------------------------------------------------------------------------ | | SResource [**GetUploadedTexture** ](/scripting/client-scripting-api-reference/network/sphotos.md#getuploadedtexture)() | | void [**GetSavedTexture** ](/scripting/client-scripting-api-reference/network/sphotos.md#getsavedtexture)(string path, Closure onComplete) | | Table [**GetInventoryTextures** ](/scripting/client-scripting-api-reference/network/sphotos.md#getinventorytextures)() | | void [**OpenUploadFileBrowser** ](/scripting/client-scripting-api-reference/network/sphotos.md#openuploadfilebrowser)() | | void [**OnUploadEnd** ](/scripting/client-scripting-api-reference/network/sphotos.md#onuploadend)(Closure c) | | void [**OnUploadStart** ](/scripting/client-scripting-api-reference/network/sphotos.md#onuploadstart)(Closure c) | #### Functions[​](#functions "Direct link to Functions") ##### GetUploadedTexture[​](#getuploadedtexture "Direct link to GetUploadedTexture") [SResource](/scripting/client-scripting-api-reference/types/sresource.md) **GetUploadedTexture** () *Function Description* * Lua ```lua resourceTexture = Space.Photos.GetUploadedTexture() ``` ##### GetSavedTexture[​](#getsavedtexture "Direct link to GetSavedTexture") void **GetSavedTexture** (string path, Closure onComplete) *Function Description* | Parameter | Type | Description | | ---------- | ------------------ | -------------------------------------------------------------------------------------------- | | path | string | | | onComplete | Closure (Callback) | Closure will be called once the saved texture has been retrieved.
onComplete(SResource) | * Lua ```lua function onComplete(SResource) resourceTexture = SResource end Space.Photos.GetSavedTexture('APath', onComplete) ``` ##### GetInventoryTextures[​](#getinventorytextures "Direct link to GetInventoryTextures") Table **GetInventoryTextures** () *Function Description* * Lua ```lua tableInventoryTexture = Space.Photos.GetInventoryTextures() ``` ##### OpenUploadFileBrowser[​](#openuploadfilebrowser "Direct link to OpenUploadFileBrowser") void **OpenUploadFileBrowser** () *Opens a window that let's you select a file you wish to upload. (white-label)* * Lua ```lua Space.Photos.OpenUploadFileBrowser() ``` * Lua ```lua --this script will open a file upload browser when clicked thisObject = Space.Host.ExecutingObject function OnClickFunction() Space.Photos.OpenUploadFileBrowser() end thisObject.AddClickable() thisObject.Clickable.Tooltip = "Click me to upload photo" thisObject.Clickable.OnClick(OnClickFunction) ``` ##### OnUploadEnd[​](#onuploadend "Direct link to OnUploadEnd") void **OnUploadEnd** (Closure c) **Binds the function c to be called when an upload operation ends.** | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua function c() -- end Space.Photos.OnUploadEnd(c) ``` * Lua ```lua --this script will show a text on screen that says "Uploading..." when a photo upload is initiated --and will hide it when the upload has ended thisObject = Space.Host.ExecutingObject textObject = Space.Host.GetReference("textObject") --add a UIText object to References in Scripting Runtime textObject.UIText.Text = "Uploading..." function OnUploadStartFunction() textObject.Active = true end function OnUploadEndFunction() textObject.Active = false end Space.Photos.OnUploadStart(OnUploadStartFunction) Space.Photos.OnUploadEnd(OnUploadEndFunction) ``` ##### OnUploadStart[​](#onuploadstart "Direct link to OnUploadStart") void **OnUploadStart** (Closure c) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua function c() -- end Space.Photos.OnUploadStart(c) ``` * Lua ```lua --this script will show a text on screen that says "Uploading..." when a photo upload is initiated --and will hide it when the upload has ended thisObject = Space.Host.ExecutingObject textObject = Space.Host.GetReference("textObject") --add a UIText object to References in Scripting Runtime textObject.UIText.Text = "Uploading..." function OnUploadStartFunction() textObject.Active = true end function OnUploadEndFunction() textObject.Active = false end Space.Photos.OnUploadStart(OnUploadStartFunction) Space.Photos.OnUploadEnd(OnUploadEndFunction) ``` --- ### SVideos #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | ----------------------------------------------------------------------------------------------------------------------- | | Table [**GetInventoryVideos** ](/scripting/client-scripting-api-reference/network/svideos.md#getinventoryvideos)() | | void [**OpenUploadFileBrowser** ](/scripting/client-scripting-api-reference/network/svideos.md#openuploadfilebrowser)() | | void [**OnUploadEnd** ](/scripting/client-scripting-api-reference/network/svideos.md#onuploadend)(Closure c) | | void [**OnUploadStart** ](/scripting/client-scripting-api-reference/network/svideos.md#onuploadstart)(Closure c) | #### Functions[​](#functions "Direct link to Functions") ##### GetInventoryVideos[​](#getinventoryvideos "Direct link to GetInventoryVideos") Table **GetInventoryVideos** () *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua tableInventoryVideos = Space.Videos.GetInventoryVideos() ``` ##### OpenUploadFileBrowser[​](#openuploadfilebrowser "Direct link to OpenUploadFileBrowser") void **OpenUploadFileBrowser** () *Opens a window that let's you select a file you wish to upload. (white-label)* * Lua ```lua Space.Videos.OpenUploadFileBrowser() ``` * Lua ```lua --this script will open a video upload window when clicked thisObject = Space.Host.ExecutingObject function OnClickFunction() Space.Videos.OpenUploadFileBrowser() end thisObject.AddClickable() thisObject.Clickable.Tooltip = "Click me to upload video" thisObject.Clickable.OnClick(OnClickFunction) ``` ##### OnUploadEnd[​](#onuploadend "Direct link to OnUploadEnd") void **OnUploadEnd** (Closure c) *Binds the function c to be called when an upload operation ends.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua function OnUploadEndFunction() -- end Space.Videos.OnUploadEnd(OnUploadEndFunction) ``` * Lua ```lua --this script will show a text on screen that says "Uploading..." when a video upload is initiated --and will hide it when the upload has ended thisObject = Space.Host.ExecutingObject textObject = Space.Host.GetReference("textObject") --add a UIText object to References in Scripting Runtime textObject.UIText.Text = "Uploading..." function OnUploadStartFunction() textObject.Active = true end function OnUploadEndFunction() textObject.Active = false end Space.Videos.OnUploadStart(OnUploadStartFunction) Space.Videos.OnUploadEnd(OnUploadEndFunction) ``` ##### OnUploadStart[​](#onuploadstart "Direct link to OnUploadStart") void **OnUploadStart** (Closure c) *Binds the function c to be called when an upload operation begins.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua function OnUploadStartFunction() -- end Space.Videos.OnUploadStart(OnUploadStartFunction) ``` * Lua ```lua --this script will show a text on screen that says "Uploading..." when a video upload is initiated --and will hide it when the upload has ended thisObject = Space.Host.ExecutingObject textObject = Space.Host.GetReference("textObject") --add a UIText object to References in Scripting Runtime textObject.UIText.Text = "Uploading..." function OnUploadStartFunction() textObject.Active = true end function OnUploadEndFunction() textObject.Active = false end Space.Videos.OnUploadStart(OnUploadStartFunction) Space.Videos.OnUploadEnd(OnUploadEndFunction) ``` --- ### SWebService #### Set up your web service[​](#set-up-your-web-service "Direct link to Set up your web service") To setup your server for communication with space, in the root of your domain, on the port you are using, place a file named 'sinewave.space.scripting.txt' containing 'SPACE\_OK'. E.g. - if this file is not present, you will be unable to use scripting to communicate with the domain. *Note: you should use HTTPS for all API calls. You may also need to implement a CORS policy in your webserver headers.* #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | void [**Get**](/scripting/client-scripting-api-reference/network/swebservice.md#get) (string url, Closure onComplete, Table headers=null, float timeout=0) | | void [**Post** ](/scripting/client-scripting-api-reference/network/swebservice.md#post)(string url, string data, Closure onComplete, Table headers=null, float timeout=0) | | SResource [**GetImage** ](/scripting/client-scripting-api-reference/network/swebservice.md#getimage)(string url, Closure onComplete=null, Table header=null, float timeout=0) | #### Functions[​](#functions "Direct link to Functions") ##### Get[​](#get "Direct link to Get") void **Get** (string url, Closure onComplete, Table headers=null, float timeout=0) *Performs an HTTP\[S] GET and invokes the callback with an* [SWebResponse](/scripting/client-scripting-api-reference/types/swebresponse.md) *containing the result.* | Parameter | Type | Description | | ---------- | ---------------- | ------------------------------------------------------------------------------------------------------------ | | url | string | The absolute URL to request. Must pass the domain whitelist check. | | onComplete | Closure | Callback receiving a single [SWebResponse](/scripting/client-scripting-api-reference/types/swebresponse.md). | | headers | Table (optional) | Supported keys: `Content-Type`, `Bearer` (maps to `Authorization: Bearer `). | | timeout | float (optional) | Timeout in seconds. `0` disables timeout. | * Lua ```lua function OnResponseFunction(responseData) -- end Space.WebServices.Get('A URL', OnResponseFunction) ``` * Lua ```lua -- Example: Retrieve user-specific data from your integration endpoint -- Typically retrieved dynamically, e.g., from Space.Scene.CurrentUser local userID = "User123" -- Identifier for the integrated service or application local serviceID = "CRMApp" -- Build the request URL with query parameters local sentData = "http://www.yourdomain.net/getIntegrationData.php?id=" .. userID .. "&service=" .. serviceID -- Callback function to handle the API response local response = function(data) if data.Error == nil then -- Log the successful response Space.Log(data.Response) else -- Log any error returned by the API Space.Log(data.Error) end end -- Make a GET request to your integration API Space.WebServices.Get(sentData, response) -- You can parse the response to extract and use relevant integration data ``` Note: * This call automatically sends diagnostic headers: `X-Sinespace-Region-ID`, `X-Sinespace-Region-Name`, `X-Sinespace-Instance-ID`, `X-Sinespace-Script-Name`, `X-Sinespace-Runtime-Type`, `X-Sinespace-In-Editor`, and `X-Sinespace-Preview-Server`. * Domains must host `/sinewave.space.scripting.txt` with the content `SPACE_OK` at the root for requests to proceed (see setup above). ##### Post[​](#post "Direct link to Post") void **Post** (string url, string data, Closure onComplete, Table headers=null, float timeout=0) *Performs an HTTP\[S] POST and invokes the callback with an* [SWebResponse](/scripting/client-scripting-api-reference/types/swebresponse.md) *containing the result.* | Parameter | Type | Description | | ---------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------- | | url | string | The absolute URL to POST to. Must pass the domain whitelist check. | | data | string | Request body. For JSON, provide a JSON string and set `Content-Type` accordingly. | | onComplete | Closure | Callback receiving a single [SWebResponse](/scripting/client-scripting-api-reference/types/swebresponse.md). | | headers | Table (optional) | Supported keys: `Content-Type` (defaults to `application/x-www-form-urlencoded`), `Bearer` (maps to `Authorization: Bearer `). | | timeout | float (optional) | Timeout in seconds. `0` disables timeout. | * Lua ```lua function OnResponseFunction(responseData) -- end local url = 'https://example.com/endpoint' local data = 'key=value' Space.WebServices.Post(url, data, OnResponseFunction) ``` * Lua ```lua -- Example: Send user-specific data to your integration endpoint via POST request -- User identifier, typically retrieved dynamically local userID = "User123" -- Identifier for the integrated service or product local serviceID = "CRMApp" -- Target URL for the integration API local url = "http://www.yourdomain.net/postIntegrationData.php" -- Construct the payload for the POST request local sentData = "id=" .. userID .. "&service=" .. serviceID -- Define a callback to handle the API response local response = function(data) if data.Error == nil then -- Log the successful response Space.Log(data.Response) else -- Log any error returned by the API Space.Log(data.Error) end end -- Set the appropriate content-type for the POST request local tableHeader = {["Content-Type"] = "text/plain"} -- Send a POST request to your integration API Space.WebServices.Post(url, sentData, response, tableHeader) ``` * Lua ```lua -- JSON POST with Bearer auth and timeout local url = "https://api.example.com/widgets" local body = '{"name":"My Widget","color":"blue"}' local headers = { ["Content-Type"] = "application/json", ["Bearer"] = "YOUR_ACCESS_TOKEN" } Space.WebServices.Post(url, body, function(data) if data.Error == nil then Space.Log("Created: " .. data.Response) else Space.Log("Error: " .. data.Error) end end, headers, 15) ``` Note: * For JSON: set `Content-Type = application/json` and send a JSON string body. * The target domain must pass the whitelist check (`/sinewave.space.scripting.txt` with `SPACE_OK`). * HTTPS is recommended; ensure the server sends appropriate CORS headers. ##### GetImage[​](#getimage "Direct link to GetImage") [SResource](/scripting/client-scripting-api-reference/types/sresource.md) **GetImage** (string url, Closure onComplete=null, Table header=null, float timeout=0) *Returns a valid* [*SResource*](/scripting/client-scripting-api-reference/types/sresource.md) *for a image on a remote domain that can be used via e.g.* [*SMaterial*](/scripting/client-scripting-api-reference/types/smaterial.md)*. While the image loads, it will be a white pixel that will be substituted with the real image once loaded.* | Parameter | Type | Description | | ---------- | ------------------ | ----------------------------------------------------------------------------------------------------------- | | url | string | The absolute image URL to load. | | onComplete | Closure (optional) | Callback receiving the resulting [SResource](/scripting/client-scripting-api-reference/types/sresource.md). | | header | Table (optional) | Accepted but not used for images; pass `nil`. Reserved for future use. | | timeout | float (optional) | Accepted but not used for images; pass `0`. Reserved for future use. | * Lua ```lua resourceImage = Space.WebServices.GetImage('An Image URL') ``` * Lua ```lua -- Example: Load and apply a remote image from your integration media server -- Image filename to retrieve from the media service local imageFileName = "user_banner_1024.jpg" -- Base URL of the content delivery server local mediaServerUrl = "https://cdn.acme-integrations.com/assets/" -- Reference to the 3D object where the image will be displayed local displayObject = Space.Host.GetReference("profileDisplay") -- Fetch the image from the server local imageResource = Space.WebServices.GetImage(mediaServerUrl .. imageFileName) -- Apply the image as a texture to the object's material displayObject.Renderer.Material.SetTexture("_MainTex", imageResource) ``` --- ### Player APIs for the local player β€” profile, inventory, in-world economy, group membership, and quest progress. --- ### SEconomy #### SEconomy[​](#seconomy-1 "Direct link to SEconomy") ##### API Keys[​](#api-keys "Direct link to API Keys") The SEconomy class gives us the ability to transfer silver or issue silver rewards from Sinespace's vault. Therefore, for the below methods to work, you will need to first set the AcessKey which is an API Key given by Sinespace. To request an API Key, [please submit a support ticket.](https://support.sine.space/support/home) Here's two API Keys which are pre-generated and available to the public: b9184836-9c73-486a-b058-a0a668b860f7 Maximum 5000 silver per 24 hours per user, AND allows up to 5000 to be deducted as well. Works only on Preview. 11f55b74-69ee-4dd3-8983-17c466912beb Maximum 500 silver per 24 hours per user. Works on Preview or Live. Note: The above two keys work with DeductSilver() and AddSilver(). You'll need an API Key which has your specific required function enabled. #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | void [**DeductSilver** ](seconomy#deductsilver)(int amount, Action< bool > onFinished=null)
void [**DeductSilver** ](seconomy#deductsilver)(int amount, Closure onFinished=null) | | void [**AddSilver** ](seconomy#addsilver)(int amount, Action< bool > onFinished=null)
void [**AddSilver** ](seconomy#addsilver)(int amount, Closure onFinished=null) | | void [**TransferSilverFrom** ](seconomy#transfersilverfrom)(int amount, string reason, int to, Action< bool > onFinished=null)
void [**TransferSilverFrom** ](seconomy#transfersilverfrom)(int amount, string reason, int to, Closure onFinished=null) | | void [**IssueReward** ](seconomy#issuereward)(int id, Action< bool > onFinished=null)
void [**IssueReward** ](seconomy#issuereward)(int id, Closure onFinished=null) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property | | -------------------------- | | string **AccessKey** `set` | #### Functions[​](#functions "Direct link to Functions") ##### DeductSilver[​](#deductsilver "Direct link to DeductSilver") void **DeductSilver** (int amount, Action< bool > onFinished=null)
void **DeductSilver** (int amount, Closure onFinished=null) *Deducts amount of silver from player's silver balance. You can also bind a function which will be called when operation is finished (optional), which also returns a Boolean if the operation succeeded or not (for example, API Key limit reached). This method requires AccessKey to be set first.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua function onFinished(success) -- end Space.Economy.DeductSilver(50, onFinished) --or Space.Economy.DeductSilver(50) ``` * Lua ```lua --the below script will deduct 50 silver from the person who clicks the object containing it --(Example: A ticket vendor that requires 50 silver to proceed) --[The AccessKey we are using below is for preview servers only] thisGameObject = Space.Host.ExecutingObject Space.Economy.AccessKey = "b9184836-9c73-486a-b058-a0a668b860f7" OnPaymentDone = function(success) if success then Space.Log("You have paid 50 silver. Please proceed.") else Space.Log("Failed. AccessKey limit may have been reached") end end OnClick = function() Space.Economy.DeductSilver(50, OnPaymentDone) end thisGameObject.AddClickable() thisGameObject.Clickable.Tooltip = "Buy ticket (50 silver)" thisGameObject.Clickable.OnClick(OnClick) ``` ##### AddSilver[​](#addsilver "Direct link to AddSilver") void **AddSilver** (int amount, Action< bool > onFinished=null)
void **AddSilver** (int amount, Closure onFinished=null) *Adds amount of silver to player's silver balance. You can also bind a function which will be called when operation is finished (optional), which also returns a Boolean if the operation succeeded or not (for example, API Key limit reached). The source of the silver is Sinespace. This method requires AccessKey to be set first.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua function onFinished(success) -- end Space.Economy.AddSilver(50, onFinished) --or Space.Economy.AddSilver(50) ``` * Lua ```lua --the below script will deduct 50 silver from the person who clicks the object containing it --(Example: A ticket vendor that requires 50 silver to proceed) --[The AccessKey we are using below is for preview servers only] thisGameObject = Space.Host.ExecutingObject Space.Economy.AccessKey = "b9184836-9c73-486a-b058-a0a668b860f7" OnPaymentDone = function(success) if success then Space.Log("You have paid 50 silver. Please proceed.") else Space.Log("Failed. AccessKey limit may have been reached") end end OnClick = function() Space.Economy.DeductSilver(50, OnPaymentDone) end thisGameObject.AddClickable() thisGameObject.Clickable.Tooltip = "Buy ticket (50 silver)" thisGameObject.Clickable.OnClick(OnClick) ``` ##### TransferSilverFrom[​](#transfersilverfrom "Direct link to TransferSilverFrom") void **TransferSilverFrom** (int amount, string reason, int to, Action< bool > onFinished=null)
void **TransferSilverFrom** (int amount, string reason, int to, Closure onFinished=null) *Removes 'amount' of silver from player avatar's balance and sends it to 'to' avatar ID. You can also bind a function which will be called when operation is finished (optional), which also returns a Boolean if the operation succeeded or not (for example, API Key limit reached). This method requires AccessKey to be set first.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua function onFinished(success) -- end Space.Economy.TransferSilverFrom(10, "A reason", 23239829,onFinished) --or Space.Economy.TransferSilverFrom(10, "A reason", 23239829) ``` * Lua ```lua --the below script will make the object a clickable that gives 10 silver to another avatar --(Example: Silver transfer) --[The AccessKey we are using below is for preview servers only. Please read the API Keys section above.] thisGameObject = Space.Host.ExecutingObject Space.Economy.AccessKey = "b9184836-9c73-486a-b058-a0a668b860f7" done = function(success) if success then Space.Log("10 Silver sent") else Space.Log("failed") end end OnClick = function() local avatars=Space.Scene.Avatars Space.Economy.TransferSilverFrom(10, "testing", avatars[1].ID, done) end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### IssueReward[​](#issuereward "Direct link to IssueReward") void **IssueReward** (int id, Action< bool > onFinished=null)
void **IssueReward** (int id, Closure onFinished=null) *Issues reward 'id' to player Avatar. You can also bind a function which will be called when operation is finished (optional), which also returns a Boolean if the operation succeeded or not (for example, API Key limit reached). This method requires AccessKey to be set first. *(white-label grid only)** | Parameter | Type | Description | | ---------- | -------------- | ------------------------------------------------------------------------------------------------------------- | | id | int | The ID of the reward to player avatar. | | onFinished | Action< bool > | A function name that will be called with a boolean parameter that tells us if the operation succeeded or not. | * Lua ```lua function onFinished(success) --success parameter is optional here Space.Log(success) end Space.Economy.IssueReward(12345,onFinished) --or Space.Economy.IssueReward(12345) ``` #### Properties[​](#properties "Direct link to Properties") ##### AcessKey[​](#acesskey "Direct link to AcessKey") string **AccessKey** `set` *This API Key needs to be set before any of the SEconomy functions will work.* [*Read API Keys Section*](/scripting/client-scripting-api-reference/player/seconomy.md#api-keys) * Lua ```lua Space.Economy.AccessKey = "b9184836-9c73-486a-b058-a0a668b860f7" ``` --- ### SGroup #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | ---------------------------------------------------------------------------------------------------------------------------- | | bool [**IsMemberOf** ](/scripting/client-scripting-api-reference/player/sgroup.md#ismemberof)(int groupID) | | SGroupInfo [**GetGroupInfo** ](/scripting/client-scripting-api-reference/player/sgroup.md#getgroupinfo)(int groupID) | | void [**JoinGroup** ](/scripting/client-scripting-api-reference/player/sgroup.md#joingroup)(int groupID, bool force=false) | | void [**LeaveGroup** ](/scripting/client-scripting-api-reference/player/sgroup.md#leavegroup)(int groupID, bool force=false) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property | | ------------------------------------------------------------------------------------------------------------- | | SGroupInfo\[] [**Membership** ](/scripting/client-scripting-api-reference/player/sgroup.md#propertyname)`get` | #### Functions[​](#functions "Direct link to Functions") ##### IsMemberOf[​](#ismemberof "Direct link to IsMemberOf") bool **IsMemberOf** (int groupID) *Whether is a member of this group.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua IsMember = Space.Groups.IsMemberOf(675) ``` * Lua ```lua --Clicking this object will check if player is a member of group with ID 350 --and it will turn green if you are, or red turn if you are not thisObject = Space.Host.ExecutingObject OnClickFunction = function() if Space.Groups.IsMemberOf(350) then thisObject.Renderer.Material.SetColor("_Color", Color.Green) else thisObject.Renderer.Material.SetColor("_Color", Color.Red) end end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### GetGroupInfo[​](#getgroupinfo "Direct link to GetGroupInfo") [SGroupInfo](/scripting/client-scripting-api-reference/types/sgroupinfo.md) **GetGroupInfo** (int groupID) *Get the group info by groupID.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua groupInfo = Space.Groups.GetGroupInfo(675) ``` * Lua ```lua --Clicking this object will turn green if your in group 350 is "Owner" --and red if your role is not "Owner" thisObject = Space.Host.ExecutingObject OnClickFunction = function() local groupInfo = Space.Groups.GetGroupInfo(350) if groupInfo.Role == "Owner" then thisObject.Renderer.Material.SetColor("_Color", Color.Green) else thisObject.Renderer.Material.SetColor("_Color", Color.Red) end end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### JoinGroup[​](#joingroup "Direct link to JoinGroup") void **JoinGroup** (int groupID, bool force=false) *Shows player a prompt to join specified group. If force is true, the user will not be shown a prompt. (force parameter is white-label only)* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Groups.JoinGroup(675) ``` * Lua ```lua --Clicking this object will check if player is in group 350 --and will prompt the player to leave if they are a member --and will prompt them to join if they are not a member thisObject = Space.Host.ExecutingObject OnClickFunction = function() if Space.Groups.IsMemberOf(350) then Space.Groups.LeaveGroup(350) else Space.Groups.JoinGroup(350) end end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### LeaveGroup[​](#leavegroup "Direct link to LeaveGroup") void **LeaveGroup** (int groupID, bool force=false) *Shows player a prompt to leave specified group. If force is true, the user will not be shown a prompt. (force parameter is white-label only)* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Groups.LeaveGroup(675) ``` * Lua ```lua --Clicking this object will check if player is in group 350 --and will prompt the player to leave if they are a member --and will prompt them to join if they are not a member thisObject = Space.Host.ExecutingObject OnClickFunction = function() if Space.Groups.IsMemberOf(350) then Space.Groups.LeaveGroup(350) else Space.Groups.JoinGroup(350) end end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` #### Properties[​](#properties "Direct link to Properties") ##### Membership[​](#membership "Direct link to Membership") [SGroupInfo](/scripting/client-scripting-api-reference/types/sgroupinfo.md)\[] **Membership** `get` *Return an array with all the groups this player is a member of* * Lua ```lua groups = Space.Groups.Membership ``` * Lua ```lua --Clicking this object will turn green if you are in at least 1 group --and red if you are in no groups thisObject = Space.Host.ExecutingObject OnClickFunction = function() local groups = Space.Groups.Membership if #groups > 0 then thisObject.Renderer.Material.SetColor("_Color", Color.Green) else thisObject.Renderer.Material.SetColor("_Color", Color.Red) end end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` --- ### SInventory #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | --------------------------------------------------------------------------------------------------------------------------------------------------- | | void [**Authorize** ](/scripting/client-scripting-api-reference/player/sinventory.md#authorize)(Closure onAuthorized=null, Closure onRejected=null) | | int [**CountCopiesOfItem** ](/scripting/client-scripting-api-reference/player/sinventory.md#countcopiesofitem)(int itemID) | | void [**AddToHotbar** ](/scripting/client-scripting-api-reference/player/sinventory.md#addtohotbar)(int index, int itemID) | | void [**RemoveFromHotbar** ](/scripting/client-scripting-api-reference/player/sinventory.md#removefromhotbar)(int index) | | void [**RequestRefresh** ](/scripting/client-scripting-api-reference/player/sinventory.md#requestrefresh)() | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | --------------------------------------------------------------------------------------------------------- | | bool [**Authorized** ](/scripting/client-scripting-api-reference/player/sinventory.md#authorized)`get` | | SInventoryItem\[] [**Items** ](/scripting/client-scripting-api-reference/player/sinventory.md#items)`get` | #### Functions[​](#functions "Direct link to Functions") ##### Authorize[​](#authorize "Direct link to Authorize") void **Authorize** (Closure onAuthorized=null, Closure onRejected=null) *Requests access to inventory functions, must be called prior to attempting to access inventory. As soon as the player has accepted the request, the Authorized attribute will be 'true'.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Inventory.Authorize() --or Space.Inventory.Authorize(onAuth, onRej) ``` * Lua ```lua --this script shows you how to use this function to take authorization and immediately --take action based on the result all in a single prompt (a click in this case) function ifno() Space.Log("not authorized") end function ifyes() Space.Log("authorized") --your next steps go here end function click() Space.Inventory.Authorize(ifyes,ifno) end Space.Host.ExecutingObject.AddClickable() Space.Host.ExecutingObject.Clickable.OnClick(click) ``` ##### CountCopiesOfItem[​](#countcopiesofitem "Direct link to CountCopiesOfItem") int **CountCopiesOfItem** (int itemID) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua numOfCopies = Space.Inventory.CountCopiesOfItem(38384839) ``` ##### AddToHotbar[​](#addtohotbar "Direct link to AddToHotbar") void **AddToHotbar** (int index, int itemID) *Adds the first found instance of itemID to the players hotbar entry at slot 'index'.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Inventory.AddToHotbar(2, 23423523) ``` ##### RemoveFromHotbar[​](#removefromhotbar "Direct link to RemoveFromHotbar") void **RemoveFromHotbar** (int index) *Remove item at slot index from Hotbar* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Inventory.RemoveFromHotbar(2) ``` ##### RequestRefresh[​](#requestrefresh "Direct link to RequestRefresh") void **RequestRefresh** () *Forces a check for external changes to the users inventory, can only be called once every 60 seconds* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Inventory.RequestRefresh() ``` #### Properties[​](#properties "Direct link to Properties") ##### Authorized[​](#authorized "Direct link to Authorized") bool **Authorized** `get` *Returns true if player has accepted access authorization request to his inventory* * Lua ```lua isAuthorized = Space.Inventory.Authorized ``` ##### Items[​](#items "Direct link to Items") [SInventoryItem](/scripting/client-scripting-api-reference/types/sinventoryitem.md)\[] **Items** `get` *Returns the array of the users current inventory items* * Lua ```lua invItems = Space.Inventory.Items ``` --- ### SProfile #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | void [**Authorize** ](sprofile#authorize)(Closure onAuthorized=null, Closure onRejected=null)
void [**Authorize** ](sprofile#authorize)(Action onAuthorized=null, Action onRejected=null) | | void [**LoadProfile** ](sprofile#authorize-1)(Action< SUserProfile > onFinished)
void [**LoadProfile** ](sprofile#authorize-1)(Closure onFinished) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ------------------------------------------------------------------------------------------------------------------------------ | | SUserProfile [**ActivePlayerProfile** ](/scripting/client-scripting-api-reference/player/sprofile.md#activeplayerprofile)`get` | #### Functions[​](#functions "Direct link to Functions") ##### Authorize[​](#authorize "Direct link to Authorize") void **Authorize** (Closure onAuthorized=null, Closure onRejected=null)
void **Authorize** (Action onAuthorized=null, Action onRejected=null) *Requests access to profile functions, must be called prior to attempting to access profile. As soon as the player has accepted the request, the Authorized attribute will be 'true'.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Profile.Authorize() --or Space.Profile.Authorize(AnOnAuthorizeFunction) --or Space.Profile.Authorize(AnOnAuthorizeFunction, AnOnRejectedFuncton) ``` ##### LoadProfile[​](#loadprofile "Direct link to LoadProfile") void **LoadProfile** (Closure onFinished) *Load the profile of player* | Parameter | Type | Description | | ---------- | ----------------- | ---------------------------------------------------------------------------------------------------------------------------- | | onFinished | Callback Function | onFinished([SUserProfile](/scripting/client-scripting-api-reference/types/suserprofile.md)) is called once profile is loaded | * Lua ```lua function onFinished(SUserProfile) -- end Space.Profile.LoadProfile(onFinished) ``` #### Properties[​](#properties "Direct link to Properties") ##### ActivePlayerProfile[​](#activeplayerprofile "Direct link to ActivePlayerProfile") [SUserProfile](/scripting/client-scripting-api-reference/types/suserprofile.md) **ActivePlayerProfile** `get` *Property Description* * Lua ```text Space.Profile.ActivePlayerProfile ``` --- ### SQuests #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | ------------------------------------------------------------------------------------------------------------------------- | | void [**StartQuest** ](/scripting/client-scripting-api-reference/player/squests.md#startquest)(int id) | | int [**GetQuestStep** ](/scripting/client-scripting-api-reference/player/squests.md#getqueststep)(int questID) | | void [**ResetQuest** ](/scripting/client-scripting-api-reference/player/squests.md#resetquest)(int id) | | void [**SetQuestStep** ](/scripting/client-scripting-api-reference/player/squests.md#setqueststep)(int questID, int step) | | void [**CompleteQuest** ](/scripting/client-scripting-api-reference/player/squests.md#completequest)(int questID) | | void [**AbortQuest** ](/scripting/client-scripting-api-reference/player/squests.md#abortquest)(int id) | | void [**AwardAchievement** ](/scripting/client-scripting-api-reference/player/squests.md#awardachievement)(int id) | | bool [**HasAchievement** ](/scripting/client-scripting-api-reference/player/squests.md#hasachievement)(int id) | #### Functions[​](#functions "Direct link to Functions") ##### StartQuest[​](#startquest "Direct link to StartQuest") void **StartQuest** (int id) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Quests.StartQuest(1001211) ``` ##### GetQuestStep[​](#getqueststep "Direct link to GetQuestStep") int **GetQuestStep** (int questID) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua currentStep = Space.Quests.GetQuestStep(1001211) ``` ##### ResetQuest[​](#resetquest "Direct link to ResetQuest") void **ResetQuest** (int id) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Quests.ResetQuest(1001211) ``` ##### SetQuestStep[​](#setqueststep "Direct link to SetQuestStep") void **SetQuestStep** (int questID, int step) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Quests.SetQuestStep(1001211, 5) ``` ##### CompleteQuest[​](#completequest "Direct link to CompleteQuest") void **CompleteQuest** (int questID) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Quests.CompleteQuest(1001211) ``` ##### AbortQuest[​](#abortquest "Direct link to AbortQuest") void **AbortQuest** (int id) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Quests.AbortQuest(1001211) ``` ##### AwardAchievement[​](#awardachievement "Direct link to AwardAchievement") void **AwardAchievement** (int id) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Quests.AwardAchievement(1001211) ``` ##### HasAchievement[​](#hasachievement "Direct link to HasAchievement") bool **HasAchievement** (int id) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua hasAchievement = Space.Quests.AwardAchievement(1001211) ``` --- ### Scene APIs for the region a script runs in β€” the scene itself, cameras, physics, rendering and post-processing, persistence, and grid-level settings. --- ### SCameraManager #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | void [**LockCamera** ](/scripting/client-scripting-api-reference/region/scameramanager.md#lockcamera)(SGameObject owner) | | void [**ReleaseCamera** ](/scripting/client-scripting-api-reference/region/scameramanager.md#releasecamera)() | | void [**SetCameraPositionOrientation** ](/scripting/client-scripting-api-reference/region/scameramanager.md#setcamerapositionorientation)(SVector position, SQuaternion orientation) | | SRay [**ScreenCoordinatesToRay** ](/scripting/client-scripting-api-reference/region/scameramanager.md#screencoordinatestoray)(SVector screenCoordinates) | | SVector [**ScreenCoordinatesToWorld** ](/scripting/client-scripting-api-reference/region/scameramanager.md#screencoordinatestoworld)(SVector screenCoordinates) | | SVector [**WorldCoordinatesToScreen** ](/scripting/client-scripting-api-reference/region/scameramanager.md#worldcoordinatestoscreen)(SVector coordinates) | | void [**ShakeCamera** ](scameramanager#shakecamera)(float magnitude, float time)
void [**ShakeCamera** ](scameramanager#shakecamera)(float amplitude, float frequency, float time) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property | | ------------------------------------------------------------------------------------------------------------------------------ | | bool [**IsLocked** ](/scripting/client-scripting-api-reference/region/scameramanager.md#propertyname)`get` | | SGameObject [**MainCamera** ](/scripting/client-scripting-api-reference/region/scameramanager.md#propertyname-1)`get` | | SGameObject [**ActiveVirtualCamera** ](/scripting/client-scripting-api-reference/region/scameramanager.md#propertyname-2)`get` | #### Properties[​](#properties "Direct link to Properties") ##### IsLocked[​](#islocked "Direct link to IsLocked") bool **IsLocked** `get` Is the Camera locked? * Lua ```lua isCameraLocked = Space.Camera.IsLocked ``` ##### MainCamera[​](#maincamera "Direct link to MainCamera") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **MainCamera** `get` *Note, this property is generally read-only. It's position is driven by internal code.* * Lua ```lua mainCamera = Space.Camera.MainCamera ``` ##### ActiveVirtualCamera[​](#activevirtualcamera "Direct link to ActiveVirtualCamera") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **ActiveVirtualCamera** `get` *The currently active Cinemachine Virtual Camera game object.* * Lua ```lua currentCamera = Space.Camera.ActiveVirtualCamera ``` #### Functions[​](#functions "Direct link to Functions") ##### LockCamera[​](#lockcamera "Direct link to LockCamera") void **LockCamera** () *Calling this function stops the Camera from being controlled by the viewer, and allows us to control it until* [*ReleaseCamera()*](/scripting/client-scripting-api-reference/region/scameramanager.md#releasecamera) *is called.* * Lua ```lua Space.Camera.LockCamera() ``` ##### ReleaseCamera[​](#releasecamera "Direct link to ReleaseCamera") void **ReleaseCamera** () *Calling this function reverses the* [*LockCamera()*](/scripting/client-scripting-api-reference/region/scameramanager.md#lockcamera) *call and returns control of the Camera to the viewer.* * Lua ```lua Space.Camera.ReleaseCamera() ``` ##### SetCameraPositionOrientation[​](#setcamerapositionorientation "Direct link to SetCameraPositionOrientation") void **SetCameraPositionOrientation** ([SVector](/scripting/client-scripting-api-reference/types/svector.md) position, [SQuaternion](/scripting/client-scripting-api-reference/types/squaternion.md) orientation) *Sets the Camera's position and rotation. This function requires* [*t*he camera to be locked.](/scripting/client-scripting-api-reference/region/scameramanager.md#lockcamera) | Parameter | Type | Description | | ----------- | ----------------------------------------------------------------------------- | -------------------------------------------- | | position | [SVector](/scripting/client-scripting-api-reference/types/svector.md) | The World Postion of the camera GameObject. | | orientation | [SQuaternion](/scripting/client-scripting-api-reference/types/squaternion.md) | The World Rotation of the camera GameObject. | * Lua ```lua Space.Camera.SetCameraPositionOrientation (Vector.New(0,0,0),Quaternion.Euler(-60,0,0)); ``` ##### ScreenCoordinatesToRay[​](#screencoordinatestoray "Direct link to ScreenCoordinatesToRay") [SRay ](/scripting/client-scripting-api-reference/types/sray.md)**ScreenCoordinatesToRay** ([SVector](/scripting/client-scripting-api-reference/types/svector.md) screenCoordinates) *Returns a ray going from camera through a screen point.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua cameraRay = Space.Camera.ScreenCoordinatesToRay (Vector.New(0,50,0)) ``` * Lua ```lua --this script will make this object jump to wherever you right click --(Example: moving objects with right click ) thisGameObject = Space.Host.ExecutingObject OnUpdate = function() if Space.Input.GetMouseDown(1) then clickRay = Space.Camera.ScreenCoordinatesToRay(Space.Input.MousePosition) rayCastHit = Space.Physics.RayCastSingle(clickRay.Origin, clickRay.Direction, 50.0) thisGameObject.WorldPosition = rayCastHit.Position end end thisGameObject.SubscribeToEvents() thisGameObject.OnUpdate(OnUpdate) ``` ##### ScreenCoordinatesToWorld[​](#screencoordinatestoworld "Direct link to ScreenCoordinatesToWorld") [SVector ](/scripting/client-scripting-api-reference/types/svector.md)**ScreenCoordinatesToWorld** ([SVector ](/scripting/client-scripting-api-reference/types/svector.md)screenCoordinates) *Transforms a point from screen space into world space.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua obj = Space.Host.ExecutingObject; Space.Log(Space.Camera.ScreenCoordinatesToWorld(Vector.New(0.5,0.5,0)).ToString()); -- Print 3 worldspace vectors created by screen space point to the console. ``` ##### WorldCoordinatesToScreen[​](#worldcoordinatestoscreen "Direct link to WorldCoordinatesToScreen") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **WorldCoordinatesToScreen** ([SVector](/scripting/client-scripting-api-reference/types/svector.md) coordinates) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local trans = Space.Host.ExecutingObject; Space.Log(Space.Camera.WorldCoordinatesToScreen(trans.WorldPosition).ToString()); -- Print the position created by world space point to the console. ``` ##### ShakeCamera[​](#shakecamera "Direct link to ShakeCamera") void **ShakeCamera** (float magnitude, float time)
void **ShakeCamera** (float amplitude, float frequency, float time) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Camera.ShakeCamera(1, 1.0) --or Space.Camera.ShakeCamera(2, 1, 1.0) ``` --- ### SGrid #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | void [**GetEnabledUserRegions** ](/scripting/client-scripting-api-reference/region/sgrid.md#getenableduserregions)(Closure onComplete) | | void [**GetRegionTexture** ](sgrid#getregiontexture)(SPublicRegion region, Closure onComplete)
void [**GetRegionTexture** ](sgrid#getregiontexture)(string json, Closure onComplete) | | void [**GetOutfits** ](/scripting/client-scripting-api-reference/region/sgrid.md#getoutfits)(Closure onComplete) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | --------------------------------------------------------------------------------------------------------------- | | bool [**IsWhiteLabel** ](/scripting/client-scripting-api-reference/region/sgrid.md#iswhitelabel)`get` | | bool [**PlayerIsAdmin** ](/scripting/client-scripting-api-reference/region/sgrid.md#playerisadmin)`get` | | bool [**PlayerIsModerator** ](/scripting/client-scripting-api-reference/region/sgrid.md#playerismoderator)`get` | | bool [**PlayerIsDeveloper** ](/scripting/client-scripting-api-reference/region/sgrid.md#playerisdeveloper)`get` | | bool [**PlayerIsTrusted** ](/scripting/client-scripting-api-reference/region/sgrid.md#playeristrusted)`get` | | SColor [**ThemeColor1** ](/scripting/client-scripting-api-reference/region/sgrid.md#themecolor1)`get` | | SColor [**ThemeColor2** ](/scripting/client-scripting-api-reference/region/sgrid.md#themecolor2)`get` | | SColor [**ThemeColor3** ](/scripting/client-scripting-api-reference/region/sgrid.md#themecolor3)`get` | | SColor [**ThemeColor4** ](/scripting/client-scripting-api-reference/region/sgrid.md#themecolor4)`get` | | SColor [**TextColor1** ](/scripting/client-scripting-api-reference/region/sgrid.md#textcolor1)`get` | | SColor [**TextColor2** ](/scripting/client-scripting-api-reference/region/sgrid.md#textcolor2)`get` | | string [**Name**](/scripting/client-scripting-api-reference/region/sgrid.md#name) `get` | | string [**SiteURL** ](/scripting/client-scripting-api-reference/region/sgrid.md#siteurl)`get` | | int [**DefaultRegion** ](/scripting/client-scripting-api-reference/region/sgrid.md#defaultregion)`get` | | int\[] [**Avatars** ](/scripting/client-scripting-api-reference/region/sgrid.md#avatars)`get` | | int [**OrientationRegion** ](/scripting/client-scripting-api-reference/region/sgrid.md#orientationregion)`get` | #### Functions[​](#functions "Direct link to Functions") ##### GetEnabledUserRegions[​](#getenableduserregions "Direct link to GetEnabledUserRegions") void **GetEnabledUserRegions** (Closure onComplete) *Calling this function will asynchronously get and return information about this player's regions as* [*SUserRegions.* ](/scripting/client-scripting-api-reference/types/suserregions.md)*(This is the same information in the "Region List" window).* | Parameter | Type | Description | | ---------- | ------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------- | | onComplete | Closure (Callback) | onComplete is a function that will be called on completion with [SUserRegions ](../types/suserregions)as a parameter.
onComplete(SUserRegions) | | | | | * Lua ```lua function GetUserRegionsComplete(SUserRegions) -- end Space.Grid.GetEnabledUserRegions(GetUserRegionsComplete) ``` * Lua ```lua --Make's a UIText show this Grid's current Subscription Tier textObject = Space.Host.GetReference("TheTextReference") --add to References section in Scripting Runtime function GetUserRegionsComplete(SUserRegions) local r = SUserRegions.SubscriptionTier text.UIText.Text = r end Space.Grid.GetEnabledUserRegions(GetUserRegionsComplete) ``` ##### GetRegionTexture[​](#getregiontexture "Direct link to GetRegionTexture") void **GetRegionTexture** ([SPublicRegion ](/scripting/client-scripting-api-reference/types/spublicregion.md)region, Closure onComplete)
void **GetRegionTexture** (string json, Closure onComplete) *Returns the Region Texture (the image seen while loading the region) as a resource. This function requires an* [*SPublicRegion*](/scripting/client-scripting-api-reference/types/spublicregion.md) *object to identify which region. (white-label grids only)* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Grid.GetRegionTexture(AnSPublicRegionObject,OnCompleteFunction) --see below example ``` * Lua ```lua --When this object is clicked, it's material becomes the Region Texture of the user's first region thisObject = Space.Host.ExecutingObject function GetTextureComplete(textureResource) thisObject.Renderer.Material.SetTexture("_MainTex",textureResource) end function GetUserRegionsComplete(SUserRegions) r = SUserRegions.AvailableRegions Space.Grid.GetRegionTexture(r[1],GetTextureComplete) end function OnClickFunction() Space.Grid.GetEnabledUserRegions(GetUserRegionsComplete) end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### GetOutfits[​](#getoutfits "Direct link to GetOutfits") void **GetOutfits** (Closure onComplete) *Calling this function will asynchronously get and return information about this player's outfits as a List of* [*SOutfit*](/scripting/client-scripting-api-reference/types/soutfit.md)*.* | Parameter | Type | Description | | ---------- | ------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | | onComplete | Closure (Callback) | onComplete is a function that will be called on completion with a List of [SOutfit](/scripting/client-scripting-api-reference/types/soutfit.md) as a parameter. | * Lua ```lua function OnGetOutfitsComplete(TableSOutfits) -- end Space.Grid.GetOutfits(OnGetOutfitsComplete) ``` #### Properties[​](#properties "Direct link to Properties") ##### IsWhiteLabel[​](#iswhitelabel "Direct link to IsWhiteLabel") bool **IsWhiteLabel** `get` *Returns true if this Grid is a white-label Grid.* * Lua ```lua isWhiteLabel = Space.Grid.IsWhiteLabel ``` * Lua ```lua --Clicking this object will turn it green color if this grid is white-label --and will turn it red color if not thisObject = Space.Host.ExecutingObject function OnClickFunction() if Space.Grid.IsWhiteLabel then thisObject.Renderer.Material.SetColor("_Color",Color.Green) else thisObject.Renderer.Material.SetColor("_Color",Color.Red) end end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### PlayerIsAdmin[​](#playerisadmin "Direct link to PlayerIsAdmin") bool **PlayerIsAdmin** `get` *Returns true if this player's Grid role is Admin.(white-label grid only)* * Lua ```lua isAdmin = Space.Grid.PlayerIsAdmin ``` * Lua ```lua --Clicking this object will turn it green color if your grid role is Admin --and will turn it red color if not thisObject = Space.Host.ExecutingObject function OnClickFunction() if Space.Grid.PlayerIsAdmin then thisObject.Renderer.Material.SetColor("_Color",Color.Green) else thisObject.Renderer.Material.SetColor("_Color",Color.Red) end end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### PlayerIsModerator[​](#playerismoderator "Direct link to PlayerIsModerator") bool **PlayerIsModerator** `get` *Returns true if this player's Grid role is Moderator. (white-label grid only)* * Lua ```lua isModerator = Space.Grid.PlayerIsModerator ``` * Lua ```lua --Clicking this object will turn it green color if your grid role is Moderator --and will turn it red color if not thisObject = Space.Host.ExecutingObject function OnClickFunction() if Space.Grid.PlayerIsModerator then thisObject.Renderer.Material.SetColor("_Color",Color.Green) else thisObject.Renderer.Material.SetColor("_Color",Color.Red) end end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### PlayerIsDeveloper[​](#playerisdeveloper "Direct link to PlayerIsDeveloper") bool **PlayerIsDeveloper** `get` *Returns true if this player's Grid role is Developer.(white-label grid only)* * Lua ```lua isDeveloper = Space.Grid.PlayerIsDeveloper ``` * Lua ```lua --Clicking this object will turn it green color if your grid role is Developer --and will turn it red color if not thisObject = Space.Host.ExecutingObject function OnClickFunction() if Space.Grid.PlayerIsDeveloper then thisObject.Renderer.Material.SetColor("_Color",Color.Green) else thisObject.Renderer.Material.SetColor("_Color",Color.Red) end end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### PlayerIsTrusted[​](#playeristrusted "Direct link to PlayerIsTrusted") bool **PlayerIsTrusted** `get` *Returns true if this player's Grid role is Trusted.(white-label grid only)* * Lua ```lua isTrusted = Space.Grid.PlayerIsTrusted ``` * Lua ```lua --Clicking this object will turn it green color if your grid role is Trusted --and will turn it red color if not thisObject = Space.Host.ExecutingObject function OnClickFunction() if Space.Grid.PlayerIsTrusted then thisObject.Renderer.Material.SetColor("_Color",Color.Green) else thisObject.Renderer.Material.SetColor("_Color",Color.Red) end end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### ThemeColor1[​](#themecolor1 "Direct link to ThemeColor1") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **ThemeColor1** `get` *The viewer's **Theme Color 1**.* *The viewer's theme consist of 4 Theme Colors and 2 Text Colors.* * Lua ```lua themeColor1 = Space.Grid.ThemeColor1 ``` ##### ThemeColor2[​](#themecolor2 "Direct link to ThemeColor2") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **ThemeColor2** `get` *The viewer's **Theme Color 2**.* *The viewer's theme consist of 4 Theme Colors and 2 Text Colors.* * Lua ```lua themeColor2 = Space.Grid.ThemeColor2 ``` ##### ThemeColor3[​](#themecolor3 "Direct link to ThemeColor3") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **ThemeColor3** `get` *The viewer's **Theme Color 3**.* *The viewer's theme consist of 4 Theme Colors and 2 Text Colors.* * Lua ```lua themeColor3 = Space.Grid.ThemeColor3 ``` ##### ThemeColor4[​](#themecolor4 "Direct link to ThemeColor4") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **ThemeColor4** `get` *The viewer's **Theme Color 4**.* *The viewer's theme consist of 4 Theme Colors and 2 Text Colors.* * Lua ```lua themeColor4 = Space.Grid.ThemeColor4 ``` ##### TextColor1[​](#textcolor1 "Direct link to TextColor1") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **TextColor1** `get` *The viewer's **Text Color 1**.* *The viewer's theme consist of 4 Theme Colors and 2 Text Colors.* * Lua ```lua textColor1 = Space.Grid.TextColor1 ``` ##### TextColor2[​](#textcolor2 "Direct link to TextColor2") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **TextColor2** `get` *The viewer's **Text Color 2**.* *The viewer's theme consist of 4 Theme Colors and 2 Text Colors.* * Lua ```lua textColor2 = Space.Grid.TextColor2 ``` ##### Name[​](#name "Direct link to Name") string **Name** `get` *Returns the Grid's Name. (white-label grid only)* * Lua ```lua gridName = Space.Grid.Name ``` * Lua ```lua --Clicking this object will populate a UIText field with the current Grid's Name thisObject = Space.Host.ExecutingObject textObject = Space.Host.GetReference("TheTextReference") function OnClickFunction() local gridName = Space.Grid.Name textObject.UIText.Text = gridName end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction ``` ##### SiteURL[​](#siteurl "Direct link to SiteURL") string **SiteURL** `get` *Returns the Grid's Site URL. (white-label grid only)* * Lua ```lua siteUrl = Space.Grid.SiteURL ``` * Lua ```lua --Clicking this object will populate a UIText field with the current Grid's Site URL thisObject = Space.Host.ExecutingObject textObject = Space.Host.GetReference("TheTextReference") function OnClickFunction() local siteURL = Space.Grid.SiteURL textObject.UIText.Text = siteURL end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction ``` ##### DefaultRegion[​](#defaultregion "Direct link to DefaultRegion") int **DefaultRegion** `get` *Returns the Region ID of the Default Region. The Default Region is set in the grid's Dashboard. (white-label grid only)* * Lua ```lua defaultRegion = Space.Grid.DefaultRegion ``` * Lua ```lua --Clicking this object will teleport the user to the grid's Default Region thisObject = Space.Host.ExecutingObject function OnClickFunction() local defaultRegion = Space.Grid.DefaultRegion Space.PlayerAvatar.Teleport(defaultRegion) end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### Avatars[​](#avatars "Direct link to Avatars") int\[] **Avatars** `get` *Returns the IDs of all Avatars in the grid. (white-label grid only)* * Lua ```lua avatars = Space.Grid.Avatars ``` * Lua ```lua --Clicking this object will populate a UIText field with the current Grid's Avatars thisObject = Space.Host.ExecutingObject textObject = Space.Host.GetReference("TheTextReference") function OnClickFunction() local avatars = Space.Grid.Avatars av = json.serialize(avatars) textObject.UIText.Text = av end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### OrientationRegion[​](#orientationregion "Direct link to OrientationRegion") int **OrientationRegion** `get` *Returns the Region ID of the "Orientation Region".* * Lua ```lua orientationRegion = Space.Grid.OrientationRegion ``` * Lua ```lua --Clicking this object will teleport the user to the grid's Orientation Region thisObject = Space.Host.ExecutingObject function OnClickFunction() local orientationRegionRegion = Space.Grid.OrientationRegion Space.PlayerAvatar.Teleport(orientationRegion) end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` --- ### SHost #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | void [**InvokeEvent** ](/scripting/client-scripting-api-reference/region/shost.md#invokeevent)(string name) | | void [**Stop** ](/scripting/client-scripting-api-reference/region/shost.md#stop)() | | void [**InvokeDelayed** ](/scripting/client-scripting-api-reference/region/shost.md#invokedelayed)(Closure c, float delay) | | void [**StartCoroutine** ](shost#startcoroutine)(DynValue value, DynValue parameter=default(DynValue), string name=null)
void [**StartCoroutine** ](shost#startcoroutine)(string value, DynValue parameter=default(DynValue) | | bool [**ReferenceExists** ](/scripting/client-scripting-api-reference/region/shost.md#referenceexists)(string name) | | bool [**ReferenceExistsAndNotEmpty** ](/scripting/client-scripting-api-reference/region/shost.md#referenceexistsandnotempty)(string name) | | SGameObject [**GetReference** ](/scripting/client-scripting-api-reference/region/shost.md#getreference)(string name) | | void [**Evaluate** ](/scripting/client-scripting-api-reference/region/shost.md#evaluate)(string script) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ------------------------------------------------------------------------------------------------------------------ | | SGameObject [**ExecutingObject** ](/scripting/client-scripting-api-reference/region/shost.md#executingobject)`get` | | string [**Language** ](/scripting/client-scripting-api-reference/region/shost.md#language)`get` | #### Functions[​](#functions "Direct link to Functions") ##### InvokeEvent[​](#invokeevent "Direct link to InvokeEvent") void **InvokeEvent** (string name) *Invokes a UnityEvent attached to the Scripting Runtime component this script is executing in.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.InvokeEvent("EventName") ``` ##### Stop[​](#stop "Direct link to Stop") void **Stop** () *Pauses the current script until it is manually restarted, at the end of the current function/method; consider using return as well.* * Lua ```lua Space.Host.Stop() ``` * Lua ```lua local trans=Space.Host.ExecutingObject; trans.SubscribeToEvents(); function Running() Space.Log("Running") end trans.OnUpdate(Running) Space.Host.InvokeDelayed(function() Space.Log("Stop") Space.Host.Stop() end,5) --After print the "Stop","Running" won't display anymore. ``` ##### InvokeDelayed[​](#invokedelayed "Direct link to InvokeDelayed") void **InvokeDelayed** (Closure c, float delay) *Invoke the closure after the delayed time.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.InvokeDelayed(AFunction, 10) ``` * Lua ```lua --Clicking this object makes it destroy itself after 5 seconds thisObject = Space.Host.ExecutingObject function DeleteFunction() thisObject.Destroy() end function OnClickFunction() Space.Host.InvokeDelayed(DeleteFunction,10) end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### StartCoroutine[​](#startcoroutine "Direct link to StartCoroutine") void **StartCoroutine** (DynValue value, DynValue parameter=default(DynValue), string name=null)
void **StartCoroutine** (string value, DynValue parameter=default(DynValue), string name=null) *Executes the specified function as a coroutine.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.StartCoroutine(aFunction) --or Space.Host.StartCoroutine("aFunctionName") ``` * Lua ```lua local function myCoroutine() -- The yield statement is a special kind of return, that ensures that the function will continue from the line once the coroutine resumes. -- Placing a float value inside of the yield will result in a delayed execution. -- Example: coroutine.yield(0.5) will wait 0.5 seconds before continuing the execution of the coroutine. -- This will print the current players active time. Space.Log(Space.Time); -- Execution of this coroutine will be halted for 10 seconds. coroutine.yield(10); -- This will print the current players active time, which will be 10 seconds greater then the previous as a result of the yield Space.Log(Space.Time); end Space.Host.StartCoroutine(myCoroutine); ``` ##### ReferenceExists[​](#referenceexists "Direct link to ReferenceExists") bool **ReferenceExists** (string name) *Return true when the reference object exists and is not empty.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua referenceExists = Space.Host.ReferenceExists("the reference name") ``` ##### ReferenceExistsAndNotEmpty[​](#referenceexistsandnotempty "Direct link to ReferenceExistsAndNotEmpty") bool **ReferenceExistsAndNotEmpty** (string name) *Return true when the reference object exists and is not empty.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua existsNotEmpty = Space.Host.ReferenceExistsAndNotEmpty("obj") --Print "false" to console if didn't set the object named "obj" to the Object References or attach the reference to "obj". ``` ##### GetReference[​](#getreference "Direct link to GetReference") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GetReference** (string name) *Pulls a reference from the scripting runtime component's "References" section by it's name.* | Parameter | Type | Description | | --------- | ------ | --------------------------------------------------------------------------------------------- | | name | string | The name of the reference as set within the Scripting Runtime component (references section). | * Lua ```lua theObject = Space.Host.GetReference("referenceName") ``` * Lua ```lua --Clicking this object makes it destroy the object we linked in the references section thisObject = Space.Host.ExecutingObject dObject = Space.Host.GetReference("theObjectToBeDestroyed") function OnClickFunction() dObject.Destroy() end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### Evaluate[​](#evaluate "Direct link to Evaluate") void **Evaluate** (string script) Executes given Lua code/script. (white-label only) | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.Evaluate('Space.Log("test")') ``` #### Properties[​](#properties "Direct link to Properties") ##### ExecutingObject[​](#executingobject "Direct link to ExecutingObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **ExecutingObject** `get` *A reference to the GameObject that is executing this script. (The GameObject that this Scripting Runtime component is attached to).* * Lua ```lua object = Space.Host.ExecutingObject ``` ##### Language[​](#language "Direct link to Language") string **Language** `get` *Returns the English name for the users language, e.g. 'English', 'French', 'Chinese'* * Lua ```lua lang = Space.Host.Language ``` * Lua ```lua --Makes a UIText show a different message according to the client's language TextObject = Space.Host.GetReference("TextObject") --add to references section of Scripting Runtime component language = Space.Host.Language if language == "English" then TextObject.UIText.Text = "Welcome!" elseif language == "Dutch" then TextObject.UIText.Text = "welkom!" elseif language == "French" then TextObject.UIText.Text = "bienvenue!" else TextObject.UIText.Text = "Welcome!" end ``` --- ### SPersistence #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | void [**UpdateInfo** ](/scripting/client-scripting-api-reference/region/spersistence.md#updateinfo)(Closure onComplete) | | string [**RetrieveValue** ](/scripting/client-scripting-api-reference/region/spersistence.md#retrievevalue)(string key) | | void [**SetValue** ](/scripting/client-scripting-api-reference/region/spersistence.md#setvalue)(string key, string value) | | void [**UpdateRegionInfo** ](spersistence#updateregioninfo)(Action onComplete)
void [**UpdateRegionInfo** ](spersistence#updateregioninfo)(Closure onComplete) | | string [**RetrieveRegionValue** ](/scripting/client-scripting-api-reference/region/spersistence.md#retrieveregionvalue)(string key) | | void [**SetRegionValue** ](/scripting/client-scripting-api-reference/region/spersistence.md#setregionvalue)(string key, string value) | #### Functions[​](#functions "Direct link to Functions") ##### UpdateInfo[​](#updateinfo "Direct link to UpdateInfo") void **UpdateInfo** (Closure onComplete) *Call the onComplete function upon the server saving a value.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua function OnCompleteFunction() -- end Space.Persistence.UpdateInfo(OnCompleteFunction) ``` * Lua ```lua Space.Persistence.SetValue("TestValue","123"); Space.Persistence.UpdateInfo(function () local value = Space.Persistence.RetrieveValue("TestValue") Space.Log(value) end) --print "123" to console. ``` ##### RetrieveValue[​](#retrievevalue "Direct link to RetrieveValue") string **RetrieveValue** (string key) *Returns the saved value with the key.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Persistence.RetrieveValue("TestValue") ``` ##### SetValue[​](#setvalue "Direct link to SetValue") void **SetValue** (string key, string value) *Save a **value** to the storage record that is accessed with **key**.* | Parameter | Type | Description | | --------- | ------ | -------------- | | key | string | Max length 48 | | value | string | Max length 255 | * Lua ```lua Space.Persistence.SetValue("MyValue", "Hello World"); ``` ##### UpdateRegionInfo[​](#updateregioninfo "Direct link to UpdateRegionInfo") void **UpdateRegionInfo** (Action onComplete)
void **UpdateRegionInfo** (Closure onComplete) *Updates your local cache with the most up-to-date values from the server. This function should be called before using the* [*RetrieveRegionValue*](/scripting/client-scripting-api-reference/region/spersistence.md#retrieveregionvalue) function. | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Persistence.SetRegionValue("TestRegionValue","456") Space.Persistence.UpdateRegionInfo(function () local value = Space.Persistence.RetrieveRegionValue("TestRegionValue") Space.Log(value) end) --print "456" to console. ``` ##### RetrieveRegionValue[​](#retrieveregionvalue "Direct link to RetrieveRegionValue") string **RetrieveRegionValue** (string key) *Retrieves the saved value from "key" from your local cache. The* [*UpdateRegionInfo* ](/scripting/client-scripting-api-reference/region/spersistence.md#updateregioninfo)*function should be called first to update your local cache with the most up-to-date values from the server.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Persistence.RetrieveRegionValue("TestRegionValue"); ``` ##### SetRegionValue[​](#setregionvalue "Direct link to SetRegionValue") void **SetRegionValue** (string key, string value) *Save the "value" to "key" on both your local cache and on the server.* | Parameter | Type | Description | | --------- | ------ | -------------- | | key | string | Max length 48 | | value | string | Max length 255 | * Lua ```lua Space.Persistence.SetRegionValue("TestRegionValue","456"); ``` --- ### SPhysics #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | SPhysicsHit\[] [**RayCast** ](/scripting/client-scripting-api-reference/region/sphysics.md#raycast)(SVector origin, SVector normal, float distance, SLayerMask layerMask=null) | | SPhysicsHit [**RayCastSingle** ](/scripting/client-scripting-api-reference/region/sphysics.md#raycastsingle)(SVector origin, SVector normal, float distance, SLayerMask layerMask=null) | | SPhysicsHit\[] [**SphereCast** ](sphysics#spherecast)(SVector origin, float radius, float distance, SVector direction, SLayerMask layerMask=null)
SPhysicsHit\[] [**SphereCast** ](sphysics#spherecast)(SVector origin, float radius, float distance, SLayerMask layerMask=null) | | SPhysicsHit\[] [**CapsuleCast** ](sphysics#capsulecast)(SVector origin, SVector end, float radius, float distance, SVector up, SLayerMask layerMask=null)
SPhysicsHit\[] [**CapsuleCast** ](sphysics#capsulecast)(SVector origin, SVector end, float radius, float distance, SLayerMask layerMask=null) | | SPhysicsHit\[] [**BoxCast** ](/scripting/client-scripting-api-reference/region/sphysics.md#boxcast)(SVector origin, SVector extents, SVector direction, SQuaternion orientation, float distance, SLayerMask layerMask=null) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ------------------------------------------------------------------------------------------------------- | | SVector [**Gravity** ](/scripting/client-scripting-api-reference/region/sphysics.md#gravity)`get` `set` | #### Functions[​](#functions "Direct link to Functions") ##### RayCast[​](#raycast "Direct link to RayCast") [SPhysicsHit](/scripting/client-scripting-api-reference/types/sphysicshit.md)\[] **RayCast** ([SVector](/scripting/client-scripting-api-reference/types/svector.md) origin, [SVector](/scripting/client-scripting-api-reference/types/svector.md) normal, float distance, [SLayerMask](/scripting/client-scripting-api-reference/types/slayermask.md) layerMask=null) *Raycasts from origin along normal, distance meters - and returns a list of collisions in distance order (closest first)* | Parameter | Type | Description | | --------- | ---------- | ----------------------------------------------------------------- | | origin | SVector | | | normal | SVector | | | distance | SVector | | | layerMask | SLayerMask | Include a layer mask if you do not want to use viewer's defaults. | * Lua ```lua tableSPhysicsHit = Space.Physics.RayCast(Vector.New(0,0,0), Vector.New(1,0,0), 2.0) ``` * Lua ```lua local trans=Space.Host.ExecutingObject function Raycast() local rays = Space.Physics.RayCast(trans.WorldPosition,trans.Forward,50) if(rays~=nil and #rays>0) then for i=0,#rays - 1 do Space.Log(rays[i].Object.Name.." i = "..i) end end end trans.OnUpdate(Raycast) ``` ##### RayCastSingle[​](#raycastsingle "Direct link to RayCastSingle") [SPhysicsHit](/scripting/client-scripting-api-reference/types/sphysicshit.md) **RayCastSingle** ([SVector](/scripting/client-scripting-api-reference/types/svector.md) origin, [SVector](/scripting/client-scripting-api-reference/types/svector.md) normal, float distance, [SLayerMask](/scripting/client-scripting-api-reference/types/slayermask.md) layerMask=null) *Raycasts from origin along normal, distance meters - and returns the first collision.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua SPhysicsHit = Space.Physics.RayCastSingle(Vector.New(0,0,0), Vector.New(1,0,0), 2.0) ``` * Lua ```lua local trans=Space.Host.ExecutingObject function RaycastSingle() local ray=Space.Physics.RayCastSingle(trans.WorldPosition,trans.Forward,50) if(ray~=nil and ray.ContainsHit==true) then Space.Log(ray.Object.Name) end end trans.OnUpdate(RaycastSingle) ``` * Lua ```lua --this script will make this object jump to wherever you right click --(Example: moving objects with right click ) thisGameObject = Space.Host.ExecutingObject OnUpdate = function() if Space.Input.GetMouseDown(1) then clickRay = Space.Camera.ScreenCoordinatesToRay(Space.Input.MousePosition) rayCastHit = Space.Physics.RayCastSingle(clickRay.Origin, clickRay.Direction, 50.0) thisGameObject.WorldPosition = rayCastHit.Position end end thisGameObject.SubscribeToEvents() thisGameObject.OnUpdate(OnUpdate) ``` ##### SphereCast[​](#spherecast "Direct link to SphereCast") [SPhysicsHit](/scripting/client-scripting-api-reference/types/sphysicshit.md)\[] **SphereCast** ([SVector](/scripting/client-scripting-api-reference/types/svector.md) origin, float radius, float distance, [SVector](/scripting/client-scripting-api-reference/types/svector.md) direction, [SLayerMask](/scripting/client-scripting-api-reference/types/slayermask.md) layerMask=null)
[SPhysicsHit](/scripting/client-scripting-api-reference/types/sphysicshit.md)\[] **SphereCast** ([SVector](/scripting/client-scripting-api-reference/types/svector.md) origin, float radius, float distance, [SLayerMask](/scripting/client-scripting-api-reference/types/slayermask.md) layerMask=null) *Sweeps from origin in a spherical ray 'radius' wide, and returns the list of collided objects* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua tableSPhysicsHit = Space.Physics.SphereCast(Vector.New(0,0,0), 3.0, 2.0, Vector.New(1,0,0)) --or tableSPhysicsHit = Space.Physics.SphereCast(Vector.New(0,0,0), 3.0, 2.0) ``` * Lua ```lua local trans=Space.Host.ExecutingObject function SphereRaycast() local center=trans.WorldPosition + Vector.New(0.5,0.5,0.5) local rays=Space.Physics.SphereCast(center,10,10,trans.Forward) if rays~=nil and #rays>0 then for i=0,#rays - 1 do Space.Log(rays[i].Object.Name.." i = "..i) end end end trans.OnUpdate(SphereRaycast) ``` ##### CapsuleCast[​](#capsulecast "Direct link to CapsuleCast") [SPhysicsHit](/scripting/client-scripting-api-reference/types/sphysicshit.md)\[] **CapsuleCast** ([SVector](/scripting/client-scripting-api-reference/types/svector.md) origin, [SVector ](/scripting/client-scripting-api-reference/types/svector.md)end, float radius, float distance, [SVector](/scripting/client-scripting-api-reference/types/svector.md) up, SLayerMask layerMask=null)
[SPhysicsHit](/scripting/client-scripting-api-reference/types/sphysicshit.md)\[] **CapsuleCast** ([SVector](/scripting/client-scripting-api-reference/types/svector.md) origin, [SVector](/scripting/client-scripting-api-reference/types/svector.md) end, float radius, float distance, [SLayerMask](/scripting/client-scripting-api-reference/types/slayermask.md) layerMask=null) *Sweeps a capsule from origin to end, radius wide and returns a list of collisions.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua tableSPhysicsHit = Space.Physics.CapsuleCast(Vector.New(0,0,0),Vector.New(0,5,0), 3.0, 2.0, Vector.New(1,0,0)) --or tableSPhysicsHit = Space.Physics.CapsuleCast(Vector.New(0,0,0),Vector.New(0,5,0), 3.0, 2.0) ``` * Lua ```lua local trans=Space.Host.ExecutingObject function CapsuleCast() local startp=trans.WorldPosition local endp=startp+trans.Up*10 local rays=Space.Physics.CapsuleCast(startp,endp,1,10,trans.Up) if rays~=nil and #rays>0 then for i=0,#rays - 1 do Space.Log(rays[i].Object.Name.." i = "..i) end end end trans.OnUpdate(CapsuleCast) ``` ##### BoxCast[​](#boxcast "Direct link to BoxCast") [SPhysicsHit](/scripting/client-scripting-api-reference/types/sphysicshit.md)\[] **BoxCast** ([SVector](/scripting/client-scripting-api-reference/types/svector.md) origin, [SVector](/scripting/client-scripting-api-reference/types/svector.md) extents, [SVector ](/scripting/client-scripting-api-reference/types/svector.md)direction, [SQuaternion](/scripting/client-scripting-api-reference/types/squaternion.md) orientation, float distance, [SLayerMask](/scripting/client-scripting-api-reference/types/slayermask.md) layerMask=null) *Sweeps a box defined by origin+halfExtents along direction, distance meters with a orientation matching orientation - and returns a list of collisions in distance order.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua tableSPhysicsHit = Space.Physics.BoxCast(Vector.New(0,0,0),Vector.New(1,1,1), Vector.New(0,1,0), Quaternion.New(0,60,0), 10.0) ``` * Lua ```lua local trans=Space.Host.ExecutingObject function BoxCast() local center=trans.WorldPosition + Vector.New(0.5,0.5,0.5) local endp=local extents=Vector.new(2,2,2) local rays=Space.Physics.BoxCast(center,extents,trans.Forward,Quaternion.Identity,2) if rays~=nil and #rays>0 then for i=0,#rays - 1 do Space.Log(rays[i].Object.Name.." i = "..i) end end end trans.OnUpdate(BoxCast) ``` #### Properties[​](#properties "Direct link to Properties") ##### Gravity[​](#gravity "Direct link to Gravity") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **Gravity** `get` `set` *The gravity applied to all rigid bodies in the Scene.* *Gravity can be turned off for an individual Rigidbody using its* [*UseGravity*](/scripting/client-scripting-api-reference/components/srigidbody.md#usegravity) *property.* * Lua ```lua Space.Physics.Gravity = Vector.New(0,-1.0,0) ``` --- ### SPostFX #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | SCommandBuffer [**CreateCommandBuffer** ](/scripting/client-scripting-api-reference/region/spostfx.md#createcommandbuffer)() | | void [**AddCommandBufferToCamera** ](/scripting/client-scripting-api-reference/region/spostfx.md#addcommandbuffertocamera)(SCommandBuffer commandbuffer, int cameraEvent=19) | | void [**RemoveCommandBufferFromCamera** ](/scripting/client-scripting-api-reference/region/spostfx.md#removecommandbufferfromcamera)(SCommandBuffer commandbuffer, int cameraEvent=19) | | void [**SetPostProfile** ](/scripting/client-scripting-api-reference/region/spostfx.md#setpostprofile)(SResource customProfile) | | void [**ClearPostProfile** ](/scripting/client-scripting-api-reference/region/spostfx.md#clearpostprofile)() | | void [**SetCrepsecularRays** ](/scripting/client-scripting-api-reference/region/spostfx.md#setcrepsecularrays)(bool on, float thresR, float thresG, float thresB, float colorR, float colorG, float colorB, float falloff, float blurSize, int blurIterations, float intensity) | | void [**SetAmbientOcclusion** ](/scripting/client-scripting-api-reference/region/spostfx.md#setambientocclusion)(bool on, float intensity, bool aoOnly) | | void [**SetMotionBlur** ](/scripting/client-scripting-api-reference/region/spostfx.md#setmotionblur)(bool on, float shutterAngle) | | void [**SetBloom** ](/scripting/client-scripting-api-reference/region/spostfx.md#setbloom)(bool on, float threshold, float intensity) | | void [**SetAnamorphicFlares** ](/scripting/client-scripting-api-reference/region/spostfx.md#setanamorphicflares)(bool on, float r, float g, float b, float intensity, float threshold, float spread, bool vertical) | | void [**SetVignette** ](/scripting/client-scripting-api-reference/region/spostfx.md#setvignette)(bool on, float r, float g, float b, float intensity) | | void [**SetLensDirt** ](/scripting/client-scripting-api-reference/region/spostfx.md#setlensdirt)(bool on, float threshold, SResource texture, float intensity) | | void [**SetChromaticAberrationPost** ](/scripting/client-scripting-api-reference/region/spostfx.md#setchromaticaberrationpost)(bool on, float strength, float cornerBlur) | | void [**SetFocus** ](/scripting/client-scripting-api-reference/region/spostfx.md#setfocus)(SGameObject target) | | void [**SupressFocus** ](/scripting/client-scripting-api-reference/region/spostfx.md#supressfocus)() | | void [**RestoreFocus** ](/scripting/client-scripting-api-reference/region/spostfx.md#restorefocus)() | | void [**SetLookUpTable** ](/scripting/client-scripting-api-reference/region/spostfx.md#setlookuptable)(SResource lut) | #### Functions[​](#functions "Direct link to Functions") ##### CreateCommandBuffer[​](#createcommandbuffer "Direct link to CreateCommandBuffer") [SCommandBuffer](/scripting/client-scripting-api-reference/types/scommandbuffer.md) **CreateCommandBuffer** () *Return a new CommandBuffer.* * Lua ```lua commandBuffer = Space.PostFX.CreateCommandBuffer() ``` * Lua ```lua local commandbuffer=Space.PostFX.CreateCommandBuffer() local mat=Space.Resources[1] local cube=Space.Host.GetReference("Cube") commandbuffer.DrawRenderer(cube.Renderer,mat.AsMaterial) Space.PostFX.AddCommandBufferToCamera(commandbuffer) ``` ##### AddCommandBufferToCamera[​](#addcommandbuffertocamera "Direct link to AddCommandBufferToCamera") void **AddCommandBufferToCamera** ([SCommandBuffer](/scripting/client-scripting-api-reference/types/scommandbuffer.md) commandbuffer, int cameraEvent=19) *Add the CommandBuffer to the Main Camera.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.PostFX.AddCommandBufferToCamera(ACommandBuffer) ---or Space.PostFX.AddCommandBufferToCamera(ACommandBuffer, 18) ``` * Lua ```lua local commandbuffer=Space.PostFX.CreateCommandBuffer() local mat=Space.Resources[1] local cube=Space.Host.GetReference("Cube") commandbuffer.DrawRenderer(cube.Renderer,mat.AsMaterial) Space.PostFX.AddCommandBufferToCamera(commandbuffer) function RemoveCommandBuffer() --Bind this function to a button and then click it in playing. Space.PostFX.RemoveCommandBufferFromCamera(commandbuffer) end ``` ##### RemoveCommandBufferFromCamera[​](#removecommandbufferfromcamera "Direct link to RemoveCommandBufferFromCamera") void **RemoveCommandBufferFromCamera** ([SCommandBuffer](/scripting/client-scripting-api-reference/types/scommandbuffer.md) commandbuffer, int cameraEvent=19) *Remove the CommandBuffer from the Main Camera.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.PostFX.RemoveCommandBufferToCamera(ACommandBuffer) ---or Space.PostFX.RemoveCommandBufferToCamera(ACommandBuffer, 18) ``` * Lua ```lua local commandbuffer=Space.PostFX.CreateCommandBuffer() local mat=Space.Resources[1] local cube=Space.Host.GetReference("Cube") commandbuffer.DrawRenderer(cube.Renderer,mat.AsMaterial) Space.PostFX.AddCommandBufferToCamera(commandbuffer) function RemoveCommandBuffer() --Bind this function to a button and then click it in playing. Space.PostFX.RemoveCommandBufferFromCamera(commandbuffer) end ``` ##### SetPostProfile[​](#setpostprofile "Direct link to SetPostProfile") void **SetPostProfile** ([SResource](/scripting/client-scripting-api-reference/types/sresource.md) customProfile) *Set a custom Space Post-Processing Profile.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.PostFX.SetPostProfile(Space.Resources[1]) ``` ##### ClearPostProfile[​](#clearpostprofile "Direct link to ClearPostProfile") void **ClearPostProfile** () *Clear current Post-Processing profile and restore default one.* * Lua ```lua Space.PostFX.ClearPostProfile() ``` ##### SetCrepsecularRays[​](#setcrepsecularrays "Direct link to SetCrepsecularRays") void **SetCrepsecularRays** (bool on, float thresR, float thresG, float thresB, float colorR, float colorG, float colorB, float falloff, float blurSize, int blurIterations, float intensity) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.PostFX.SetCrepsecularRays(true, 255.0, 0.0, 0.0, 0.0,0.0, 255.0, 1.0, 1.0, 2, 4.0) ``` ##### SetAmbientOcclusion[​](#setambientocclusion "Direct link to SetAmbientOcclusion") void **SetAmbientOcclusion** (bool on, float intensity, bool aoOnly) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.PostFX.SetAmbientOcclusion(true, 4.0, true) ``` ##### SetMotionBlur[​](#setmotionblur "Direct link to SetMotionBlur") void **SetMotionBlur** (bool on, float shutterAngle) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.PostFX.SetMotionBlur(true, 20.0) ``` ##### SetBloom[​](#setbloom "Direct link to SetBloom") void **SetBloom** (bool on, float threshold, float intensity) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.PostFX.SetBloom(true, 2.0, 4.0) ``` ##### SetAnamorphicFlares[​](#setanamorphicflares "Direct link to SetAnamorphicFlares") void **SetAnamorphicFlares** (bool on, float r, float g, float b, float intensity, float threshold, float spread, bool vertical) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.PostFX.SetBloom(true, 255.0, 0.0, 0.0, 4.0, 2.0, 3.0, true) ``` ##### SetVignette[​](#setvignette "Direct link to SetVignette") void **SetVignette** (bool on, float r, float g, float b, float intensity) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.PostFX.SetVignette(true, 255.0, 0.0, 0.0, 4.0) ``` ##### SetLensDirt[​](#setlensdirt "Direct link to SetLensDirt") void **SetLensDirt** (bool on, float threshold, SResource texture, float intensity) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.PostFX.SetLensDirt(true, 4.0, Space.Resources[1], 4.0) ``` ##### SetChromaticAberrationPost[​](#setchromaticaberrationpost "Direct link to SetChromaticAberrationPost") void **SetChromaticAberrationPost** (bool on, float strength, float cornerBlur) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.PostFX.SetChromaticAberrationPost(true, 4.0, 1.0) ``` ##### SetFocus[​](#setfocus "Direct link to SetFocus") void **SetFocus** ([SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) target) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.PostFX.SetFocus(Space.Host.ExecutingObject) ``` ##### SupressFocus[​](#supressfocus "Direct link to SupressFocus") void **SupressFocus** () *Function Description* * Lua ```lua Space.PostFX.SupressFocus() ``` ##### RestoreFocus[​](#restorefocus "Direct link to RestoreFocus") void **RestoreFocus** () *Function Description* * Lua ```lua Space.PostFX.RestoreFocus() ``` ##### SetLookUpTable[​](#setlookuptable "Direct link to SetLookUpTable") void **SetLookUpTable** ([SResource](/scripting/client-scripting-api-reference/types/sresource.md) lut) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.PostFX.SetLookUpTable(Space.Resources[1]) ``` --- ### SRenderSettings #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | | void [**SetGlobalShaderTexture** ](/scripting/client-scripting-api-reference/region/srendersettings.md#setglobalshadertexture)(string name, SResource dir) | | void [**SetGlobalShaderFloat** ](/scripting/client-scripting-api-reference/region/srendersettings.md#setglobalshaderfloat)(string name, float dir) | | void [**SetGlobalShaderColor** ](/scripting/client-scripting-api-reference/region/srendersettings.md#setglobalshadercolor)(string name, SColor dir) | | void [**SetGlobalShaderVector** ](/scripting/client-scripting-api-reference/region/srendersettings.md#setglobalshadervector)(string name, SVector dir) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | --------------------------------------------------------------------------------------------------------------------------------------------------------- | | int [**DefaultReflectionResolution** ](/scripting/client-scripting-api-reference/region/srendersettings.md#defaultreflectionresolution)`get` `set` | | SMaterial [**Skybox** ](/scripting/client-scripting-api-reference/region/srendersettings.md#skybox)`get` `set` | | float [**FlareFadeSpeed** ](/scripting/client-scripting-api-reference/region/srendersettings.md#flarefadespeed)`get` `set` | | float [**FlareStrength** ](/scripting/client-scripting-api-reference/region/srendersettings.md#flarestrength)`get` `set` | | float [**HaloStrength** ](/scripting/client-scripting-api-reference/region/srendersettings.md#halostrength)`get` `set` | | int [**ReflectionBounces** ](/scripting/client-scripting-api-reference/region/srendersettings.md#reflectionbounces)`get` `set` | | float [**ReflectionIntensity** ](/scripting/client-scripting-api-reference/region/srendersettings.md#reflectionintensity)`get` `set` | | SColor [**SubtractiveShadowColor** ](/scripting/client-scripting-api-reference/region/srendersettings.md#subtractiveshadowcolor)`get` `set` | | float [**AmbientIntensity** ](/scripting/client-scripting-api-reference/region/srendersettings.md#ambientintensity)`get` `set` | | SColor [**AmbientLight** ](/scripting/client-scripting-api-reference/region/srendersettings.md#ambientlight)`get` `set` | | SColor [**AmbientGroundColor** ](/scripting/client-scripting-api-reference/region/srendersettings.md#ambientgroundcolor)`get` `set` | | SColor [**AmbientEquatorColor** ](/scripting/client-scripting-api-reference/region/srendersettings.md#ambientequatorcolor)`get` `set` | | SColor [**AmbientSkyColor** ](/scripting/client-scripting-api-reference/region/srendersettings.md#ambientskycolor)`get` `set` | | SAmbientMode [**AmbientMode** ](/scripting/client-scripting-api-reference/region/srendersettings.md#ambientmode)`get` `set` | | float [**FogEndDistance** ](/scripting/client-scripting-api-reference/region/srendersettings.md#fogenddistance)`get` `set` | | float [**FogStartDistance** ](/scripting/client-scripting-api-reference/region/srendersettings.md#fogstartdistance)`get` `set` | | float [**FogDensity** ](/scripting/client-scripting-api-reference/region/srendersettings.md#fogdensity)`get` `set` | | SColor [**FogColor** ](/scripting/client-scripting-api-reference/region/srendersettings.md#fogcolor)`get` `set` | | SFogMode [**FogMode** ](/scripting/client-scripting-api-reference/region/srendersettings.md#fogmode)`get` `set` | | bool [**Fog** ](/scripting/client-scripting-api-reference/region/srendersettings.md#fog)`get` `set` | | float [**AmbientSkyboxAmount** ](/scripting/client-scripting-api-reference/region/srendersettings.md#ambientskyboxamount)`get` `set` | | SDefaultReflectionMode [**DefaultReflectionMode** ](/scripting/client-scripting-api-reference/region/srendersettings.md#defaultreflectionmode)`get` `set` | #### Functions[​](#functions "Direct link to Functions") ##### SetGlobalShaderTexture[​](#setglobalshadertexture "Direct link to SetGlobalShaderTexture") void **SetGlobalShaderTexture** (string name, [SResource](/scripting/client-scripting-api-reference/types/sresource.md) dir) *Set a global texture property.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.RenderSettings.SetGlobalShaderTexture("_TestTex",Space.Resources[1]) ``` ##### SetGlobalShaderFloat[​](#setglobalshaderfloat "Direct link to SetGlobalShaderFloat") void **SetGlobalShaderFloat** (string name, float dir) *Set a global float property for all shaders.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.RenderSettings.SetGlobalShaderFloat("_Mult",1) ``` ##### SetGlobalShaderColor[​](#setglobalshadercolor "Direct link to SetGlobalShaderColor") void **SetGlobalShaderColor** (string name, [SColor](/scripting/client-scripting-api-reference/types/scolor.md) dir) *Set a global color property for all shaders.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.RenderSettings.SetGlobalShaderFloat("_TestColor",Color.Red) ``` ##### SetGlobalShaderVector[​](#setglobalshadervector "Direct link to SetGlobalShaderVector") void **SetGlobalShaderVector** (string name, [SVector](/scripting/client-scripting-api-reference/types/svector.md) dir) *Set a global color property for all shaders.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.RenderSettings.SetGlobalShaderFloat("_TestVector",Vector.One) ``` #### Properties[​](#properties "Direct link to Properties") ##### DefaultReflectionResolution[​](#defaultreflectionresolution "Direct link to DefaultReflectionResolution") int **DefaultReflectionResolution** `get` `set` *Cubemap resolution for default reflection.* * Lua ```lua Space.RenderSettings.DefaultReflectionResolution=256 ``` * Lua ```lua --the below script will make a slider change the Render Setting's Cube Map Resolution thisGameObject = Space.Host.ExecutingObject slider = Space.Host.GetReference("slider").UISlider --add reference to Scripting Runtime OVC = function() Space.RenderSettings.DefaultReflectionResolution = slider.Value * 4096 -- from 0 to 40906 end slider.OnValueChanged(OVC) ``` ##### Skybox[​](#skybox "Direct link to Skybox") [SMaterial](/scripting/client-scripting-api-reference/types/smaterial.md) **Skybox** `get` `set` *The global skybox to use.* * Lua ```lua Space.RenderSettings.Skybox=Space.Resources[1].AsMaterial ``` * Lua ```lua --clicking this object will toggle between two Skyboxes --[Add 2 materials to the first two Resource slots in Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject OnClick = function() if Space.RenderSettings.Skybox==Space.Resources[1].AsMaterial then Space.RenderSettings.Skybox=Space.Resources[2].AsMaterial else Space.RenderSettings.Skybox=Space.Resources[1].AsMaterial end end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### FlareFadeSpeed[​](#flarefadespeed "Direct link to FlareFadeSpeed") float **FlareFadeSpeed** `get` `set` *The fade speed of all flares in the Scene.* * Lua ```lua Space.RenderSettings.FlareFadeSpeed=5 ``` * Lua ```lua --the below script will make a slider change the Render Setting's Flare Fade Speed thisGameObject = Space.Host.ExecutingObject slider = Space.Host.GetReference("slider").UISlider --add reference to Scripting Runtime OVC = function() Space.RenderSettings.FlareFadeSpeed = slider.Value * 5 -- from 0 to 5 end slider.OnValueChanged(OVC) ``` ##### FlareStrength[​](#flarestrength "Direct link to FlareStrength") float **FlareStrength** `get` `set` *The intensity of all flares in the Scene.* * Lua ```lua Space.RenderSettings.FlareStrength=1 ``` * Lua ```lua --the below script will make a slider change the Render Setting's Flare Strength thisGameObject = Space.Host.ExecutingObject slider = Space.Host.GetReference("slider").UISlider --add reference to Scripting Runtime OVC = function() Space.RenderSettings.FlareStrength = slider.Value * 5 -- from 0 to 5 end slider.OnValueChanged(OVC) ``` ##### HaloStrength[​](#halostrength "Direct link to HaloStrength") float **HaloStrength** `get` `set` *Size of the light halos.* * Lua ```lua Space.RenderSettings.HaloStrength=1 ``` * Lua ```lua --the below script will make a slider change the Render Setting's Halo Strength thisGameObject = Space.Host.ExecutingObject slider = Space.Host.GetReference("slider").UISlider --add reference to Scripting Runtime OVC = function() Space.RenderSettings.HaloStrength = slider.Value * 5 -- from 0 to 5 end slider.OnValueChanged(OVC) ``` ##### ReflectionBounces[​](#reflectionbounces "Direct link to ReflectionBounces") int **ReflectionBounces** `get` `set` *The number of times a reflection includes other reflections.* * Lua ```lua Space.RenderSettings.ReflectionBounces=5 ``` * Lua ```lua --the below script will make a slider change the Render Setting's Reflection Bounces thisGameObject = Space.Host.ExecutingObject slider = Space.Host.GetReference("slider").UISlider --add reference to Scripting Runtime OVC = function() Space.RenderSettings.ReflectionBounces = slider.Value * 5 -- from 0 to 5 end slider.OnValueChanged(OVC) ``` ##### ReflectionIntensity[​](#reflectionintensity "Direct link to ReflectionIntensity") float **ReflectionIntensity** `get` `set` *How much the skybox / custom cubemap reflection affects the Scene.* * Lua ```lua Space.RenderSettings.ReflectionIntensity=1 ``` * Lua ```lua --the below script will make a slider change the Render Setting's Reflection Intensity thisGameObject = Space.Host.ExecutingObject slider = Space.Host.GetReference("slider").UISlider --add reference to Scripting Runtime OVC = function() Space.RenderSettings.ReflectionIntensity = slider.Value * 5 -- from 0 to 5 end slider.OnValueChanged(OVC) ``` ##### SubtractiveShadowColor[​](#subtractiveshadowcolor "Direct link to SubtractiveShadowColor") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **SubtractiveShadowColor** `get` `set` *The color used for the sun shadows in the Subtractive lightmode.* * Lua ```lua Space.RenderSettings.SubtractiveShadowColor=Color.Red ``` * Lua ```lua --clicking the object will open a color picker that changes the Subtractive Shadow Color thisGameObject = Space.Host.ExecutingObject originalColor = Space.RenderSettings.SubtractiveShadowColor OnChange = function(SColor) Space.RenderSettings.SubtractiveShadowColor = SColor end OnSelect = function(SColor) Space.RenderSettings.SubtractiveShadowColor = SColor end OnCancel = function() Space.RenderSettings.SubtractiveShadowColor = originalColor end OnClick = function() Space.Dialogues.ColorPicker("title","okbutton", OnChange, OnSelect, OnCancel, originalColor) end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### AmbientIntensity[​](#ambientintensity "Direct link to AmbientIntensity") float **AmbientIntensity** `get` `set` *How much the light from the Ambient Source affects the Scene.* * Lua ```lua Space.RenderSettings.AmbientIntensity = 1 ``` * Lua ```lua --the below script will make a slider change the Render Setting's Ambient Intensity thisGameObject = Space.Host.ExecutingObject slider = Space.Host.GetReference("slider").UISlider --add reference to Scripting Runtime OVC = function() Space.RenderSettings.AmbientIntensity = slider.Value * 5 -- from 0 to 5 end slider.OnValueChanged(OVC) ``` ##### AmbientLight[​](#ambientlight "Direct link to AmbientLight") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **AmbientLight** `get` `set` *Flat ambient lighting color.* * Lua ```lua Space.RenderSettings.AmbientLight=Color.Blue ``` * Lua ```lua --clicking the object will open a color picker that changes the Ambient Light Color thisGameObject = Space.Host.ExecutingObject originalColor = Space.RenderSettings.AmbientLight OnChange = function(SColor) Space.RenderSettings.AmbientLight = SColor end OnSelect = function(SColor) Space.RenderSettings.AmbientLight = SColor end OnCancel = function() Space.RenderSettings.AmbientLight = originalColor end OnClick = function() Space.Dialogues.ColorPicker("title","okbutton", OnChange, OnSelect, OnCancel, originalColor) end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### AmbientGroundColor[​](#ambientgroundcolor "Direct link to AmbientGroundColor") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **AmbientGroundColor** `get` `set` *Ambient lighting coming from below.* * Lua ```lua Space.RenderSettings.AmbientGroundColor=Color.Green ``` * Lua ```lua --clicking the object will open a color picker that changes the Ambient Ground Color thisGameObject = Space.Host.ExecutingObject originalColor = Space.RenderSettings.AmbientGroundColor OnChange = function(SColor) Space.RenderSettings.AmbientGroundColor = SColor end OnSelect = function(SColor) Space.RenderSettings.AmbientGroundColor = SColor end OnCancel = function() Space.RenderSettings.AmbientGroundColor = originalColor end OnClick = function() Space.Dialogues.ColorPicker("title","okbutton", OnChange, OnSelect, OnCancel, originalColor) end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### AmbientEquatorColor[​](#ambientequatorcolor "Direct link to AmbientEquatorColor") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **AmbientEquatorColor** `get` `set` *Ambient lighting coming from the sides.* * Lua ```lua Space.RenderSettings.AmbientEquatorColor=Color.Green ``` * Lua ```lua --clicking the object will open a color picker that changes the Ambient Equator Color thisGameObject = Space.Host.ExecutingObject originalColor = Space.RenderSettings.AmbientEquatorColor OnChange = function(SColor) Space.RenderSettings.AmbientEquatorColor = SColor end OnSelect = function(SColor) Space.RenderSettings.AmbientEquatorColor = SColor end OnCancel = function() Space.RenderSettings.AmbientEquatorColor= originalColor end OnClick = function() Space.Dialogues.ColorPicker("title","okbutton", OnChange, OnSelect, OnCancel, originalColor) end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### AmbientSkyColor[​](#ambientskycolor "Direct link to AmbientSkyColor") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **AmbientSkyColor** `get` `set` *Ambient lighting coming from above.* * Lua ```lua Space.RenderSettings.AmbientSkyColor=Color.White ``` * Lua ```lua --clicking the object will open a color picker that changes the Ambient Sky Color thisGameObject = Space.Host.ExecutingObject originalColor = Space.RenderSettings.AmbientSkyColor OnChange = function(SColor) Space.RenderSettings.AmbientSkyColor = SColor end OnSelect = function(SColor) Space.RenderSettings.AmbientSkyColor = SColor end OnCancel = function() Space.RenderSettings.AmbientSkyColor = originalColor end OnClick = function() Space.Dialogues.ColorPicker("title","okbutton", OnChange, OnSelect, OnCancel, originalColor) end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### AmbientMode[​](#ambientmode "Direct link to AmbientMode") int **AmbientMode** `get` `set` *Ambient lighting mode.* Skybox = 1. Trilight = 2. Flat = 3. Custom = 4. * Lua ```lua Space.RenderSettings.AmbientMode=1 ``` * Lua ```lua --clicking this object will toggle between 4 Ambient Modes thisGameObject = Space.Host.ExecutingObject OnClick = function() if Space.RenderSettings.AmbientMode==4 then Space.RenderSettings.AmbientMode=1 else Space.RenderSettings.AmbientMode = Space.RenderSettings.AmbientMode + 1 end end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### FogEndDistance[​](#fogenddistance "Direct link to FogEndDistance") float **FogEndDistance** `get` `set` *The ending distance of linear fog.* * Lua ```lua Space.RenderSettings.FogEndDistance=300 ``` * Lua ```lua --the below script will make a slider change the Render Setting's Fog End Distance thisGameObject = Space.Host.ExecutingObject slider = Space.Host.GetReference("slider").UISlider --add reference to Scripting Runtime OVC = function() Space.RenderSettings.FogEndDistance = (slider.Value * 170) + 30-- from 30 to 200 end slider.OnValueChanged(OVC) ``` ##### FogStartDistance[​](#fogstartdistance "Direct link to FogStartDistance") float **FogStartDistance** `get` `set` *The starting distance of linear fog.* * Lua ```lua Space.RenderSettings.FogStartDistance=10 ``` * Lua ```lua --the below script will make a slider change the Render Setting's Fog Start Distance thisGameObject = Space.Host.ExecutingObject slider = Space.Host.GetReference("slider").UISlider --add reference to Scripting Runtime OVC = function() Space.RenderSettings.FogStartDistance = (slider.Value * 10) -- from 0 to 10 end slider.OnValueChanged(OVC) ``` ##### FogDensity[​](#fogdensity "Direct link to FogDensity") float **FogDensity** `get` `set` *The density of the exponential fog.* * Lua ```lua Space.RenderSettings.FogDensity=10 ``` * Lua ```lua --the below script will make a slider change the Render Setting's Fog Density thisGameObject = Space.Host.ExecutingObject slider = Space.Host.GetReference("slider").UISlider --add reference to Scripting Runtime OVC = function() Space.RenderSettings.FogDensity = (slider.Value * 10) -- from 0 to 10 end slider.OnValueChanged(OVC) ``` ##### FogColor[​](#fogcolor "Direct link to FogColor") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **FogColor** `get` `set` *The color of the fog.* * Lua ```lua Space.RenderSettings.FogColor = Color.Red ``` * Lua ```lua --clicking the object will open a color picker that changes the Fog color thisGameObject = Space.Host.ExecutingObject originalColor = Space.RenderSettings.FogColor OnChange = function(SColor) Space.RenderSettings.FogColor = SColor end OnSelect = function(SColor) Space.RenderSettings.FogColor = SColor end OnCancel = function() Space.RenderSettings.FogColor = originalColor end OnClick = function() Space.Dialogues.ColorPicker("title","okbutton", OnChange, OnSelect, OnCancel, originalColor) end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### FogMode[​](#fogmode "Direct link to FogMode") int **FogMode** `get` `set` *Ambient lighting mode.* Linear = 1. Exponential = 2. ExponentialSquared = 3. * Lua ```lua Space.RenderSettings.FogMode=2 ``` * Lua ```lua --clicking this object will toggle between 3 Fog Modes thisGameObject = Space.Host.ExecutingObject OnClick = function() if Space.RenderSettings.FogMode==3 then Space.RenderSettings.FogMode=1 else Space.RenderSettings.FogMode = Space.RenderSettings.FogMode + 1 end end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### Fog[​](#fog "Direct link to Fog") bool **Fog** `get` `set` *Whether Fog is enabled* * Lua ```lua Space.RenderSettings.Fog=true ``` * Lua ```lua --clicking this object will toggle enable/disable Fog thisGameObject = Space.Host.ExecutingObject OnClick = function() Space.RenderSettings.Fog = not Space.RenderSettings.Fog end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` ##### AmbientSkyboxAmount[​](#ambientskyboxamount "Direct link to AmbientSkyboxAmount") float **AmbientSkyboxAmount** `get` `set` *How much the light from the Ambient Source affects the Scene.* * Lua ```lua Space.RenderSettings.AmbientSkyboxAmount=10 ``` * Lua ```lua --the below script will make a slider change the Render Setting's Ambient Skybox Amount thisGameObject = Space.Host.ExecutingObject slider = Space.Host.GetReference("slider").UISlider --add reference to Scripting Runtime OVC = function() Space.RenderSettings.AmbientSkyboxAmount = (slider.Value * 10) -- from 0 to 10 end slider.OnValueChanged(OVC) ``` ##### DefaultReflectionMode[​](#defaultreflectionmode "Direct link to DefaultReflectionMode") int **DefaultReflectionMode** `get` `set` *Ambient lighting mode.* Skybox = 0. Custom = 1. * Lua ```lua Space.RenderSettings.DefaultReflectionMode = 1 ``` * Lua ```lua --clicking this object will toggle between two Default Reflection Modes thisGameObject = Space.Host.ExecutingObject OnClick = function() if Space.RenderSettings.DefaultReflectionMode==1 then Space.RenderSettings.DefaultReflectionMode=0 else Space.RenderSettings.DefaultReflectionMode=1 end end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClick) ``` --- ### SScene #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | | SGameObject [**Find** ](/scripting/client-scripting-api-reference/region/sscene.md#find)(string name) | | SGameObject [**FindID** ](/scripting/client-scripting-api-reference/region/sscene.md#findid)(string id) | | void [**MarkObjectTemporary** ](/scripting/client-scripting-api-reference/region/sscene.md#markobjecttemporary)(SGameObject obj) | | SAvatar [**GetAvatar** ](sscene#getavatar)(long id)
SAvatar [**GetAvatar** ](sscene#getavatar)(string name) | | SGameObject [**CreateGameObject** ](sscene#creategameobject)(string name)
SGameObject [**CreateGameObject** ](sscene#creategameobject)(SResource resource) | | void [**SwitchToInstance** ](/scripting/client-scripting-api-reference/region/sscene.md#switchtoinstance)(uint id) | | void [**OnPlayerJoin** ](/scripting/client-scripting-api-reference/region/sscene.md#onplayerjoin)(Closure e) | | void [**OnPlayerLeave** ](/scripting/client-scripting-api-reference/region/sscene.md#onplayerleave)(Closure e) | | void [**OnEditModeStart** ](/scripting/client-scripting-api-reference/region/sscene.md#oneditmodestart)(Closure e) | | void [**OnEditModeEnd** ](/scripting/client-scripting-api-reference/region/sscene.md#oneditmodeend)(Closure e) | | void [**OnEditModeAdd** ](/scripting/client-scripting-api-reference/region/sscene.md#oneditmodeadd)(Closure e) | | void [**OnEditModeRemove** ](/scripting/client-scripting-api-reference/region/sscene.md#oneditmoderemove)(Closure e) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ---------------------------------------------------------------------------------------------------------------- | | SAvatar [**PlayerAvatar** ](/scripting/client-scripting-api-reference/region/sscene.md#playeravatar)`get` | | SAvatar\[] [**Avatars** ](/scripting/client-scripting-api-reference/region/sscene.md#avatars)`get` | | List< SAvatar > [**AllAvatars** ](/scripting/client-scripting-api-reference/region/sscene.md#allavatars)`get` | | int [**Population** ](/scripting/client-scripting-api-reference/region/sscene.md#population)`get` | | SGameObject\[] [**Objects** ](/scripting/client-scripting-api-reference/region/sscene.md#objects)`get` | | string [**Name** ](/scripting/client-scripting-api-reference/region/sscene.md#name)`get` | | string [**Url** ](/scripting/client-scripting-api-reference/region/sscene.md#url)`get` | | long [**RegionID** ](/scripting/client-scripting-api-reference/region/sscene.md#regionid)`get` | | long [**InstanceID** ](/scripting/client-scripting-api-reference/region/sscene.md#instanceid)`get` | | long [**Owner** ](/scripting/client-scripting-api-reference/region/sscene.md#owner)`get` | | bool [**PlayerIsOwner** ](/scripting/client-scripting-api-reference/region/sscene.md#playerisowner)`get` | | bool [**PlayerIsAdmin** ](/scripting/client-scripting-api-reference/region/sscene.md#playerisadmin)`get` | | bool [**PlayerIsModerator** ](/scripting/client-scripting-api-reference/region/sscene.md#playerismoderator)`get` | | bool [**PlayerIsDeveloper** ](/scripting/client-scripting-api-reference/region/sscene.md#playerisdeveloper)`get` | | bool [**PlayerIsTrusted** ](/scripting/client-scripting-api-reference/region/sscene.md#playeristrusted)`get` | | bool [**IsInEditMode** ](/scripting/client-scripting-api-reference/region/sscene.md#isineditmode)`get` | | SGameObject\[] [**Floors** ](/scripting/client-scripting-api-reference/region/sscene.md#floors)`get` | | SLandmark\[] [**Landmarks** ](/scripting/client-scripting-api-reference/region/sscene.md#landmarks)`get` | #### Functions[​](#functions "Direct link to Functions") ##### Find[​](#find "Direct link to Find") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **Find** (string name) *Finds a single Game Object matching 'Name' and returns it. Can use '/' characters to designate a path (e.g. 'Parent/Child' returns Child with 'Parent')* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Scene.Find('Door2') ``` * Lua ```lua hand = Space.Scene.Find("Hand"); --This returns the GameObject named Hand. hand = Space.Scene.Find("/Hand"); --This returns the GameObject named Hand. --Hand must not have a parent in the Hierarchy view. hand = Space.Scene.Find("/Monster/Arm/Hand"); --This returns the GameObject named Hand, --which is a child of Arm > Monster. --Monster must not have a parent in the Hierarchy view. hand = Space.Scene.Find("Monster/Arm/Hand"); --This returns the GameObject named Hand, --which is a child of Arm > Monster. ``` ##### FindID[​](#findid "Direct link to FindID") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **FindID** (string id) *Finds a single Game Object using ID and returns it* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua --add Scene Object Database to a Gameobject, set "123" to IDs and name the GameObject "Cube". local obj=Space.Scene.FindID("123") Space.Log(obj.Name); --print "Cube" if the object exists. ``` ##### MarkObjectTemporary[​](#markobjecttemporary "Direct link to MarkObjectTemporary") void **MarkObjectTemporary** ([SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) obj) *Marks the Game Object as temporary. Temporary objects will be cleaned up automatically if the script is destroyed or reset. Can be used to handle cleanup from procedural objects created by a script.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Scene.MarkObjectTemporary(AnObjectReference) ``` ##### GetAvatar[​](#getavatar "Direct link to GetAvatar") [SAvatar](/scripting/client-scripting-api-reference/types/savatar.md) **GetAvatar** (long id)
[SAvatar](/scripting/client-scripting-api-reference/types/savatar.md) **GetAvatar** (string name) *Get reference to an avatar* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua theAvatar =Space.Scene.GetAvatar(43) --or theAvatar =Space.Scene.GetAvatar("TestUser") ``` ##### CreateGameObject[​](#creategameobject "Direct link to CreateGameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **CreateGameObject** (string name)
[SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **CreateGameObject** ([SResource](/scripting/client-scripting-api-reference/types/sresource.md) resource) *Creates a game object from the specified resource* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Scene.CreateGameObject('NewBall') --or Space.Scene.CreateGameObject(Space.Resources[1]) ``` * Lua ```lua --clicking this object will create a GameObject from a resource and place it above our avatar thisObject = Space.Host.ExecutingObject thisPlayer = Space.Scene.PlayerAvatar resource = Space.GetResource("Tomato") --add it as resource in your Scripting Runtime component OnClick = function() createdObject = Space.Scene.CreateGameObject(resource) createdObject.WorldPosition = thisPlayer.GameObject.WorldPosition + thisPlayer.GameObject.Up end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### SwitchToInstance[​](#switchtoinstance "Direct link to SwitchToInstance") void **SwitchToInstance** (uint id) *Switch to a shard region.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Scene.SwitchToInstance(2) ``` ##### OnPlayerJoin[​](#onplayerjoin "Direct link to OnPlayerJoin") void **OnPlayerJoin** (Closure e) *Event which fires whenever a player joins the region* | Parameter | Type | Description | | --------- | ------------------ | ----------- | | e | Closure (Callback) | e(SAvatar) | * Lua ```lua --Place this script in a UIText object and it will --update itself with the name of the last player joined function updateText(Av) --we include "Av" here because the event gives us a reference to the Avatar that joined Space.Host.ExecutingObject.UIText.Text= "Last player joined: " .. Av.Username end Space.Scene.OnPlayerJoin(updateText) -- updateText will now be called everytime a player joins ``` ##### OnPlayerLeave[​](#onplayerleave "Direct link to OnPlayerLeave") void **OnPlayerLeave** (Closure e) *Event which fires whenever a player leaves the region* | Parameter | Type | Description | | --------- | ------------------ | ----------- | | e | Closure (Callback) | e(long) | * Lua ```lua function playerLeft(id) -- end Space.Scene.OnPlayerLeave(playerLeft) ``` * Lua ```lua --Place this script in a UIText object and it will --update itself with the name of the last player left function updateText(Av) --we include "Av" here because the event gives us a reference to the Avatar that has left Space.Host.ExecutingObject.UIText.Text= "Last player left: " .. Av.Username end Space.Scene.OnPlayerLeave(updateText) -- updateText will now be called every time a player leaves ``` ##### OnEditModeStart[​](#oneditmodestart "Direct link to OnEditModeStart") void **OnEditModeStart** (Closure e) *An event which is fired when player enters Room Edit mode* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Scene.OnEditModeStart(AFunctionName) ``` * Lua ```lua --makes an object become active upon entering edit mode thisObject = Space.Host.ExecutingObject targetObject = Space.Host.GetReference("target") --add to references in Scripting Runtime component function OnEditModeFunction() targetObject.Active = true end Space.Scene.OnEditModeStart(OnEditModeFunction) ``` ##### OnEditModeEnd[​](#oneditmodeend "Direct link to OnEditModeEnd") void **OnEditModeEnd** (Closure e) *An event which is fired when player exits Room Edit mode* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Scene.OnEditModeEnd(AfunctionName) ``` * Lua ```lua --makes an object become active upon exiting edit mode thisObject = Space.Host.ExecutingObject targetObject = Space.Host.GetReference("target") --add to references in Scripting Runtime component function OnEditModeFunction() targetObject.Active = false end Space.Scene.OnEditModeEnd(OnEditModeFunction) ``` ##### OnEditModeAdd[​](#oneditmodeadd "Direct link to OnEditModeAdd") void **OnEditModeAdd** (Closure e) *An event which is fired when object is added during Edit Mode* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Scene.OnEditModeAdd(AFunctionName) ``` * Lua ```lua --prints the total number of objects in the scene whenever a new object is added in edit mode function OnEditModeFunction() Space.Log(#Space.Scene.Objects) end Space.Scene.OnEditModeAdd(OnEditModeFunction) ``` ##### OnEditModeRemove[​](#oneditmoderemove "Direct link to OnEditModeRemove") void **OnEditModeRemove** (Closure e) *An event which is fired when object is deleted during Edit Mode* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Scene.OnEditModeRemove(AFunctionName) ``` * Lua ```lua --prints the total number of objects in the scene whenever a new object is removed in edit mode function OnEditModeFunction() Space.Log(#Space.Scene.Objects) end Space.Scene.OnEditModeRemove(OnEditModeFunction) ``` #### Properties[​](#properties "Direct link to Properties") ##### PlayerAvatar[​](#playeravatar "Direct link to PlayerAvatar") [SAvatar](/scripting/client-scripting-api-reference/types/savatar.md) **PlayerAvatar** `get` *Returns the current player avatar. If this script is calling this upon initialisation, the Player may not exist yet, and you will want to wait a few frames until the avatar is present before continuing.* * Lua ```lua CurrentPlayer = Space.Scene.PlayerAvatar ``` ##### Avatars[​](#avatars "Direct link to Avatars") [SAvatar](/scripting/client-scripting-api-reference/types/savatar.md)\[] **Avatars** `get` *Returns a list of Avatars in the scene* * Lua ```lua avatars = Space.Scene.Avatars ``` * Lua ```lua --this script, once clicked, will get all avatars in the scene --and print their ID, Username and Title (excluding self) --(Example: scoreboards/radars/scanners/game machines) thisGameObject = Space.Host.ExecutingObject OnClick = function() Avatars = Space.Scene.Avatars if #Avatars > 0 then for var=1, #Avatars do local ID = Avatars[var].ID local Username = Avatars[var].Username local Title = Avatars[var].Title if Title == "" then Title = "None" end Space.Log("ID: " .. ID .. ", Username: " .. Username .. ", Title: " .. Title) end else Space.Log("No Avatars") end end thisGameObject.AddClickable() thisGameObject.Clickable.Tooltip = "Click to print all avatars' information" thisGameObject.Clickable.OnClick(OnClick) ``` ##### AllAvatars[​](#allavatars "Direct link to AllAvatars") List< [SAvatar](/scripting/client-scripting-api-reference/types/savatar.md) > **AllAvatars** `get` *Returns a list of all avatars in the scene. The player avatar that is calling this will be added to the end of the list.* * Lua ```lua local avatars=Space.Scene.AllAvatars Space.Log(#avatars) --Print the length of AllAvatars. ``` * Lua ```lua --this script, once clicked, will get all avatars in the scene --and print their ID, Username and Title (including self) --(Example: scoreboards/radars/scanners/game machines) thisGameObject = Space.Host.ExecutingObject OnClick = function() allAvatars = Space.Scene.AllAvatars for var=1, #allAvatars do local ID = allAvatars[var].ID local Username = allAvatars[var].Username local Title = allAvatars[var].Title if Title == "" then Title = "None" end Space.Log("ID: " .. ID .. ", Username: " .. Username .. ", Title: " .. Title) end end thisGameObject.AddClickable() thisGameObject.Clickable.Tooltip = "Click to print all avatars' information" thisGameObject.Clickable.OnClick(OnClick) ``` ##### Population[​](#population "Direct link to Population") int **Population** `get` *Property Description* * Lua ```lua currentPopulation = Space.Scene.Population ``` ##### Objects[​](#objects "Direct link to Objects") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md)\[] **Objects** `get` *Returns a list of Objects in the scene. IMPORTANT: This function is slow, you should cache the result and avoid calling this every frame.* * Lua ```lua objects = Space.Scene.Objects ``` * Lua ```lua --clicking this object will print a name of every object in the scene --[better use a coroutine incase the foor loop exceeds allowed frame time] thisObject = Space.Host.ExecutingObject OnClickFunction = function() local objects = Space.Scene.Objects for i=1, #objects, 1 do Space.Log(objects[i].Name) end end thisObject.AddClickable() ``` ##### Name[​](#name "Direct link to Name") string **Name** `get` *Returns the name of the current region* * Lua ```lua RegionName = Space.Scene.Name ``` * Lua ```lua --this object will be clickable only if it is in a region called "X Region" --((for example: limiting object functionality to a specific region)) thisObject = Space.Host.ExecutingObject OnClick = function() Space.Log("We are in X Region") end if Space.Scene.Name == "X Region" then thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) end ``` ##### Url[​](#url "Direct link to Url") string **Url** `get` *Returns the URL of the current region* * Lua ```lua RegionUrl = Space.Scene.Url ``` * Lua ```lua --the URL of this region will be placed in a UIText upon loading --and also printed if this object is clicked thisObject = Space.Host.ExecutingObject textObject = Space.Host.GetReference("textObject") -- add to scripting runtime references function OnClick() Space.Log(Space.Scene.Url) end textObject.UIText.Text = Space.Scene.Url thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### RegionID[​](#regionid "Direct link to RegionID") long **RegionID** `get` *Returns the region ID of current region.* * Lua ```lua Space.Log(Space.Scene.RegionID) ``` * Lua ```lua --the RegionID of this region will be placed in a UIText upon loading --and also printed if this object is clicked thisObject = Space.Host.ExecutingObject textObject = Space.Host.GetReference("textObject") -- add to scripting runtime references function OnClick() Space.Log(Space.Scene.RegionID) end textObject.UIText.Text = Space.Scene.RegionID thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### InstanceID[​](#instanceid "Direct link to InstanceID") long **InstanceID** `get` *Return the instance ID of current region.* * Lua ```lua instanceID = Space.Scene.InstanceID ``` * Lua ```lua --the RegionID of this region will be placed in a UIText upon loading --and also printed if this object is clicked thisObject = Space.Host.ExecutingObject textObject = Space.Host.GetReference("textObject") -- add to scripting runtime references function OnClick() Space.Log(Space.Scene.InstanceID) end textObject.UIText.Text = Space.Scene.InstanceID thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### Owner[​](#owner "Direct link to Owner") long **Owner** `get` *Returns the avatar ID of the regions owner* * Lua ```lua RegionOwner = Space.Scene.Owner ``` * Lua ```lua --this script will make this object only clickable for the region owner thisObject = Space.Host.ExecutingObject thisPlayer = Space.Scene.PlayerAvatar OnClick = function() Space.Log("Do Something") end if thisPlayer.ID == Space.Scene.Owner then thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) end ``` ##### PlayerIsOwner[​](#playerisowner "Direct link to PlayerIsOwner") bool **PlayerIsOwner** `get` *Returns whether the current player is the owner of the region* * Lua ```lua isOwner = Space.Scene.PlayerIsOwner ``` * Lua ```lua --this script will make the object a clickable, but only if player is region owner --(Example: Access control) thisGameObject = Space.Host.ExecutingObject OnClick = function() Space.Log("this click was only possible because you are a region Owner") end if Space.Scene.PlayerIsOwner then thisGameObject.AddClickable() thisGameObject.Clickable.Tooltip = "Click me" thisGameObject.Clickable.OnClick(OnClick) end ``` ##### PlayerIsAdmin[​](#playerisadmin "Direct link to PlayerIsAdmin") bool **PlayerIsAdmin** `get` *Does this Player have the **Admin** role?* * Lua ```lua Space.Scene.PlayerIsAdmin ``` * Lua ```lua --this script will make the object a clickable, but only if player is region Admin --(Example: Access control) thisGameObject = Space.Host.ExecutingObject OnClick = function() Space.Log("this click was only possible because you are a region Admin") end if Space.Scene.PlayerIsAdmin then thisGameObject.AddClickable() thisGameObject.Clickable.Tooltip = "Click me Admin" thisGameObject.Clickable.OnClick(OnClick) end ``` ##### PlayerIsModerator[​](#playerismoderator "Direct link to PlayerIsModerator") bool **PlayerIsModerator** `get` *Does this Player have the **Moderator** role?* * Lua ```lua playerIsModerator = Space.Scene.PlayerIsModerator ``` * Lua ```lua --this script will make the object a clickable, but only if player is Moderator in this region --(Example: Access control) thisGameObject = Space.Host.ExecutingObject OnClick = function() Space.Log('this click was only possible because you are Moderator in this region') end if Space.Scene.PlayerIsModerator then thisGameObject.AddClickable() thisGameObject.Clickable.Tooltip = "Click me Moderator" thisGameObject.Clickable.OnClick(OnClick) end ``` ##### PlayerIsDeveloper[​](#playerisdeveloper "Direct link to PlayerIsDeveloper") bool **PlayerIsDeveloper** `get` *Does this Player have the **Developer** role?* * Lua ```lua playerIsDeveloper = Space.Scene.PlayerIsDeveloper ``` ##### PlayerIsTrusted[​](#playeristrusted "Direct link to PlayerIsTrusted") bool **PlayerIsTrusted** `get` Does this Player have the **Trusted** role? * Lua ```lua playerIsTrusted = Space.Scene.PlayerIsTrusted ``` * Lua ```lua --this script will make the object a clickable, but only if player is Trusted in this region --(Example: Access control) thisGameObject = Space.Host.ExecutingObject OnClick = function() Space.Log("this click was only possible because you are Trusted in this region") end if Space.Scene.PlayerIsTrusted then thisGameObject.AddClickable() thisGameObject.Clickable.Tooltip = "Click me Trusted" thisGameObject.Clickable.OnClick(OnClick) end ``` ##### IsInEditMode[​](#isineditmode "Direct link to IsInEditMode") bool **IsInEditMode** `get` *Returns true if current player is in edit mode.* * Lua ```lua Space.Log(Space.Scene.IsInEditMode) ``` * Lua ```lua --makes an object only active when this player is in Edit Mode thisObject = Space.Host.ExecutingObject targetObject = Space.Host.GetReference("target") --add to references in Scripting Runtime component function OnUpdateFunction() targetObject.Active = Space.Scene.IsInEditMode end thisObject.OnUpdate(OnUpdateFunction) ``` ##### Floors[​](#floors "Direct link to Floors") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md)\[] **Floors** `get` *Return an array of all floors in the region.* * Lua ```lua for i=1,#Space.Scene.Floors do Space.Log(Space.Scene.Floors[i].Name) end --print all floor names. ``` * Lua ```lua example 2 ``` ##### Landmarks[​](#landmarks "Direct link to Landmarks") [SLandmark](/scripting/client-scripting-api-reference/types/slandmark.md)\[] **Landmarks** `get` *Return all Landmarks in the region* * Lua ```lua local landmark = Space.Scene.Landmarks for i = 1,#landmark do if landmark[i].Type == LandmarkType.LandingZone then Space.Log("LandingZone") end Space.Log(landmark[i].Name .. " ".. landmark[i].Position.ToString()) end ``` --- ### SScript #### Functions[​](#functions "Direct link to Functions") ##### TypeName[​](#typename "Direct link to TypeName") string **TypeName** (DynValue dv) *Return the type name of the value.* | Parameter | Type | Description | | --------- | -------- | ----------- | | dv | DynValue | | * Lua ```lua typeName = Space.TypeName("123") ``` ##### TrackingAllowed[​](#trackingallowed "Direct link to TrackingAllowed") bool **TrackingAllowed** (string key) *Returns true on white-label grids when the user has opted into tracking for the given key. Always returns false on the main grid.* | Parameter | Type | Description | | --------- | ------ | -------------------------------------------------------------------------- | | key | string | A unique identifier used to store and look up the user's tracking consent. | * Lua ```lua isTrackingAllowed = Space.TrackingAllowed('3423423423423') ``` ##### TrackingRequest[​](#trackingrequest "Direct link to TrackingRequest") void **TrackingRequest** (string key, string privacynotice, Closure callback, bool force=false) *Displays a consent prompt (EULA-style) asking the user to allow tracking for a given key. On white-label grids, stores the user's choice and invokes the callback with a boolean indicating consent. On the main grid, this does nothing.* | Parameter | Type | Description | | ------------- | ------- | ------------------------------------------------------------------------------------ | | key | string | A unique identifier used to store and look up the user's tracking consent. | | privacynotice | string | The privacy notice text to display in the consent dialog. | | callback | Closure | A function invoked with one boolean parameter: `true` if allowed, `false` otherwise. | | force | bool | If `true`, show the prompt even if a stored decision exists. Defaults to `false`. | * Lua ```lua -- Request consent (white-label only). The callback receives a boolean 'allowed'. Space.TrackingRequest('24234234234234', 'A notice message', function(allowed) if allowed then Space.Log("Tracking allowed") else Space.Log("Tracking denied") end end) -- or force re-prompt even if a decision was saved previously: Space.TrackingRequest('24234234234234', 'A notice message', function(allowed) end, true) ``` ##### GetResource[​](#getresource "Direct link to GetResource") [SResource](/scripting/client-scripting-api-reference/types/sresource.md) **GetResource** (string name) *Returns a reference to a SResource using it's Resource name.* | Parameter | Type | Description | | --------- | ------ | ---------------------------------------------------------------------------------- | | name | string | Name of the Resource as set in the Scripting Runtime Component (Resources section) | * Lua ```lua aResource = Space.GetResource("ResourceName") ``` ##### LogEvent[​](#logevent "Direct link to LogEvent") void **LogEvent** (string eventName, float value, [SVector](/scripting/client-scripting-api-reference/types/svector.md) position) *Logs an analytics event to the server on white-label grids.* | Parameter | Type | Description | | --------- | ------- | --------------------------------------------- | | eventName | string | The name of the analytics event. | | value | float | A numeric value associated with the event. | | position | SVector | A world position to associate with the event. | * Lua ```lua Space.LogEvent('event name', 2.0, Vector.New(0,0,0) ) ``` ##### Log[​](#log "Direct link to Log") void **Log** (DynValue text, bool logToFile=false)
void **Log** (string text, bool logToFile=false) *Log a message to console.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Log(Color.Blue) --or Space.Log("Log") --or Space.Log("Log",true) ``` #### Properties[​](#properties "Direct link to Properties") ##### Inventory[​](#inventory "Direct link to Inventory") [SInventory](/scripting/client-scripting-api-reference/player/sinventory.md) **Inventory** `get` *Allows access to the users inventory* * Lua ```lua inventory = Space.Inventory ``` ##### Persistence[​](#persistence "Direct link to Persistence") [SPersistence](/scripting/client-scripting-api-reference/region/spersistence.md) **Persistence** `get` *Stores information between user sessions, and for other users* * Lua \`\`\` persistence = Space.Persistence \`\`\` ##### Scene[​](#scene "Direct link to Scene") [SScene](/scripting/client-scripting-api-reference/region/sscene.md) **Scene** `get` *Allows access to the current scene graph (objects and avatars in the scene, and other information)* * Lua ```lua scene = Space.Scene ``` ##### Grid[​](#grid "Direct link to Grid") [SGrid](/scripting/client-scripting-api-reference/region/sgrid.md) **Grid** `get` *Property Description* * Lua ```lua grid = Space.Grid ``` ##### Host[​](#host "Direct link to Host") [SHost](/scripting/client-scripting-api-reference/region/shost.md) **Host** `get` *Access information about the current scripting runtime host* * Lua ```lua host = Space.Host ``` ##### Physics[​](#physics "Direct link to Physics") [SPhysics](/scripting/client-scripting-api-reference/region/sphysics.md) **Physics** `get` *Call physics-related commands, and variables, such as raycasting* * Lua ```lua physics = Space.Physics ``` ##### Math[​](#math "Direct link to Math") [SMath](/scripting/client-scripting-api-reference/types/smath.md) **Math** `get` *Math related functions (Sin, Cos, Tan, etc)* * Lua ```lua Space.Math.Ceil(4.0) ``` ##### String[​](#string "Direct link to String") [SString](/scripting/client-scripting-api-reference/types/sstring.md) **String** `get` *Miscellaneous additional string functions (e.g. MD5Sum)* * Lua ```lua Space.String.GetBytes("some data") ``` ##### Input[​](#input "Direct link to Input") [SInput](/scripting/client-scripting-api-reference/client/sinput.md) **Input** `get` *Input device related functions (mouse position, keyboard state)* * Lua ```lua Space.Input.Vibrate(1,1,false) ``` ##### Camera[​](#camera "Direct link to Camera") [SCameraManager](/scripting/client-scripting-api-reference/region/scameramanager.md) **Camera** `get` *Take and control the users camera* * Lua ```lua obj = Space.Host.ExecutingObject Space.Camera.LockCamera (obj) ``` ##### WebServices[​](#webservices "Direct link to WebServices") [SWebService](/scripting/client-scripting-api-reference/network/swebservice.md) **WebServices** `get` *Call remote web services to designated hosts (will not work with arbitrary domains, see page for details)* * Lua ```lua Space.WebServices.GetImage("example.com/mrlee.jpg") ``` ##### Network[​](#network "Direct link to Network") [SNetwork](/scripting/client-scripting-api-reference/network/snetwork.md) **Network** `get` *Send data to other clients through the region server* * Lua ```lua Space.Network.SubscribeToNetwork("helloworld", gotAMessageFunction) ``` ##### PostFX[​](#postfx "Direct link to PostFX") [SPostFX](/scripting/client-scripting-api-reference/region/spostfx.md) **PostFX** `get` *Property Description* * Lua ```lua Space.PostFX ``` ##### AudioAnalyser[​](#audioanalyser "Direct link to AudioAnalyser") SAudioAnalyser **AudioAnalyser** `get` *Property Description* * Lua ```lua Space.AudioAnalyser ``` ##### Tween[​](#tween "Direct link to Tween") STween **Tween** `get` *Property Description* * Lua ```lua Space.Tween ``` ##### UI[​](#ui "Direct link to UI") [SUI](/scripting/client-scripting-api-reference/client/sui.md) **UI** `get` *Property Description* * Lua ```lua ui = Space.UI ``` ##### Dialogues[​](#dialogues "Direct link to Dialogues") [SDialogues](/scripting/client-scripting-api-reference/client/sdialogues.md) **Dialogues** `get` *Property Description* * Lua ```lua dialogues = Space.Dialogues ``` ##### Shared[​](#shared "Direct link to Shared") [SShared](/scripting/client-scripting-api-reference/client/sshared.md) **Shared** `get` *Property Description* * Lua ```lua shared = Space.Shared ``` ##### Quests[​](#quests "Direct link to Quests") [SQuests](/scripting/client-scripting-api-reference/player/squests.md) **Quests** `get` *Property Description* * Lua ```lua quests = Space.Quests ``` ##### Economy[​](#economy "Direct link to Economy") [SEconomy](/scripting/client-scripting-api-reference/player/seconomy.md) **Economy** `get` *Property Description* * Lua ```lua economy = Space.Economy ``` ##### Groups[​](#groups "Direct link to Groups") [SGroup](/scripting/client-scripting-api-reference/player/sgroup.md) **Groups** `get` *Property Description* * Lua ```lua groups = Space.Groups ``` ##### Activity[​](#activity "Direct link to Activity") SActivity **Activity** `get` *Property Description* * Lua \`\`\` activity = Space.Activity \`\`\` ##### RenderSettings[​](#rendersettings "Direct link to RenderSettings") [SRenderSettings](/scripting/client-scripting-api-reference/region/srendersettings.md) **RenderSettings** `get` *Property Description* * Lua ```lua renderSettings = Space.RenderSettings ``` ##### Profile[​](#profile "Direct link to Profile") [SProfile](/scripting/client-scripting-api-reference/player/sprofile.md) **Profile** `get` *Property Description* * Lua ```lua profile = Space.Profile ``` ##### Photos[​](#photos "Direct link to Photos") [SPhotos](/scripting/client-scripting-api-reference/network/sphotos.md) **Photos** `get` *Property Description* * Lua ```lua photos = Space.Photos ``` ##### Videos[​](#videos "Direct link to Videos") [SVideos](/scripting/client-scripting-api-reference/network/svideos.md) **Videos** `get` *Property Description* * Lua ```lua videos = Space.Videos ``` ##### MusicDirectory[​](#musicdirectory "Direct link to MusicDirectory") SMusicDirectory **MusicDirectory** `get` *Property Description* * Lua ```lua musicDirectory = Space.MusicDirectory ``` ##### Journey[​](#journey "Direct link to Journey") SJourney **Journey** `get` *Property Description* * Lua ```lua journey = Space.Journey ``` ##### GameTester[​](#gametester "Direct link to GameTester") SGameTester **GameTester** `get` *Property Description* * Lua ```lua gameTester = Space.GameTester ``` ##### RuntimeType[​](#runtimetype "Direct link to RuntimeType") string **RuntimeType** `get` *Return current RuntimeType name.* * Lua ```lua runtimeType = Space.RuntimeType ``` ##### Platform[​](#platform "Direct link to Platform") string **Platform** `get` *Return current platform name.* * Lua ```lua platform = Space.Platform ``` ##### SessionID[​](#sessionid "Direct link to SessionID") string **SessionID** `get` *Return current SessionID.* * Lua ```lua sessionID = Space.SessionID ``` ##### InEditor[​](#ineditor "Direct link to InEditor") bool **InEditor** `get` *Return true if in unity editor.* * Lua ```lua isInEditor = Space.InEditor ``` * Lua ```lua --the below script checks if we are in Unity editor or in SS --this way we can provide an alternative --(Example: if we're using a function that doesn't work in Unity editor) thisGameObject = Space.Host.ExecutingObject if Space.InEditor then avatarUsername = "Player Name" else avatarUsername = Space.Scene.GetAvatar(thisGameObject.Owner).Username --example: this doesn't work in Editor end Space.Log(avatarUsername) ``` ##### Version[​](#version "Direct link to Version") int **Version** `get` *Returns the numeric build version of the viewer (for programmatic comparisons). In the Unity Editor this returns `int.MaxValue`; if unknown at runtime it returns `-1`.* * Lua ```lua viewerVersion = Space.Version ``` ##### FullVersionString[​](#fullversionstring "Direct link to FullVersionString") string **FullVersionString** `get` *Returns the full build version display string tied to release notes (e.g., "2025.6f210"). Best for user-facing display and logging.* * Lua ```lua viewerVersionString = Space.FullVersionString ``` ##### Resources[​](#resources "Direct link to Resources") [SResource](/scripting/client-scripting-api-reference/types/sresource.md)\[] **Resources** `get` *Property Description* * Lua ```lua tableOfResources = Space.Resources ``` * Lua ```lua --the below script will search through the Scripting Runtime's resources --and return the first instance of an Animation Clip --[You need to add a few resources to the scripting runtime and make one of them an animation] resources = Space.Resources for i = 1, #resources do if resources[i].Type == "AnimationClip" then Space.Log("Resource #".. i .. " is an Animation Clip. The resource name is: " .. resources[i].Name) break end end ``` ##### Time[​](#time "Direct link to Time") float **Time** `get` *Returns time at the beginning of this frame.* * Lua ```lua floatTime = Space.Time ``` * Lua ```lua --this script will update a UIText object with the current local time without using a coroutine --(example: clock ) --[UIText object needs to be added to the references section in the scripting runtime with name "Text"] rateUpdate = 1.0 nextUpdate = 0.0 text = Space.Host.GetReference("Text").UIText OnUpdate = function() if Space.Time > nextUpdate then nextUpdate = Space.Time + rateUpdate text.Text = Space.LocalTime end } Space.Host.ExecutingObject.OnUpdate(OnUpdate) ``` ##### ServerTime[​](#servertime "Direct link to ServerTime") string **ServerTime** `get` *Returns current server time.* * Lua ```lua serverTime = Space.ServerTime ``` * Lua ```lua --this script will update a UIText object with the current server time (UTC) --(example: clock) --[UIText object needs to be added to the references section in the scripting runtime with name "Text"] text = Space.Host.GetReference("Text").UIText co = function() while true do text.Text = Space.ServerTime coroutine.yield(1) end end Space.Host.StartCoroutine(co) ``` ##### LocalTime[​](#localtime "Direct link to LocalTime") string **LocalTime** `get` *Returns current local time.* * Lua ```lua localTime = Space.LocalTime ``` * Lua ```lua --this script will update a UIText object with the current local time --(example: clock) --[UIText object needs to be added to the references section in the scripting runtime with name "Text"] text = Space.Host.GetReference("Text").UIText co = function() while true do text.Text = Space.LocalTime coroutine.yield(1) end end Space.Host.StartCoroutine(co) ``` ##### LoginTime[​](#logintime "Direct link to LoginTime") float **LoginTime** `get` *Returns how long player has been logged in (in seconds).* * Lua ```lua loginTime = Space.LoginTime ``` * Lua ```lua --this script will update a UIText object with how long the user has been logged in (in seconds) --(example: clock) --[UIText object needs to be added to the references section in the scripting runtime with name "Text"] text = Space.Host.GetReference("Text").UIText co = function() while true do text.Text = Space.LoginTime coroutine.yield(1) end end Space.Host.StartCoroutine(co) ``` ##### ServerTimeUnix[​](#servertimeunix "Direct link to ServerTimeUnix") int **ServerTimeUnix** `get` *Returns the server time unix timestamp.* * Lua ```lua serverTimeUnix = Space.ServerTimeUnix ``` * Lua ```lua --this script will update a UIText object with the current server time unix timestamp --(example: clock) --[UIText object needs to be added to the references section in the scripting runtime with name "Text"] text = Space.Host.GetReference("Text").UIText co = function() while true do text.Text = Space.ServerTimeUnix coroutine.yield(1) end end Space.Host.StartCoroutine(co) ``` ##### LocalTimeUnix[​](#localtimeunix "Direct link to LocalTimeUnix") int **LocalTimeUnix** `get` *Returns the local time unix timestamp.* * Lua ```lua localTimeUnix = Space.LocalTimeUnix ``` * Lua ```lua --this script will update a UIText object with the current local time unix timestamp --(example: clock) --[UIText object needs to be added to the references section in the scripting runtime with name "Text"] text = Space.Host.GetReference("Text").UIText co = function() while true do text.Text = Space.LocalTimeUnix coroutine.yield(1) end end Space.Host.StartCoroutine(co) ``` ##### DeltaTime[​](#deltatime "Direct link to DeltaTime") float **DeltaTime** `get` *The completion time in seconds since the last frame.* * Lua ```lua deltaTime = Space.DeltaTime ``` * Lua ```lua --the below script rotates an object around Y axis but uses DeltaTime --to make sure it's not dependant on client's Framerate (FPS) --this way the object rotates per second not per frame --(Example: Important movement in OnUpdate) thisGameObject = Space.Host.ExecutingObject OnUpdate = function() currentY = thisGameObject.WorldRotation.EulerAngles.Y newRotation = Quaternion.Euler(0, currentY + 1 * Space.DeltaTime, 0) --We multiplied 1 by Space.DeltaTime thisGameObject.WorldRotation = newRotation end thisGameObject.OnUpdate(OnUpdate) ``` ##### PreviewServer[​](#previewserver "Direct link to PreviewServer") bool **PreviewServer** `get` *Return true if in preview server.* * Lua ```lua isInPreview = Space.PreviewServer ``` * Lua ```lua --this script will update a UIText object with "preview" or "live" depending --whether we are on preview server or live server --[UIText object needs to be added to the references section in the scripting runtime with name "Text"] text = Space.Host.GetReference("Text").UIText OnUpdate = function() if Space.PreviewServer then text.Text = "Preview" else text.Text = "Live" end end Space.Host.ExecutingObject.OnUpdate(OnUpdate) ``` ##### ComponentName[​](#componentname "Direct link to ComponentName") string **ComponentName** `get` *The name of this component.* * Lua ```lua componentName = Space.ComponentName ``` --- ### Types The data types passed to and returned from the client API β€” vectors, colours, transforms, and math helpers, plus the structures that describe avatars, items, and resources. --- ### SAnimationState #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | --------------------------------------------------------------------------------------------------------------------------- | | bool [**Enabled** ](/scripting/client-scripting-api-reference/types/sanimationstate.md#enabled)`get` `set` | | float [**Length** ](/scripting/client-scripting-api-reference/types/sanimationstate.md#length)`get` | | string [**Name** ](/scripting/client-scripting-api-reference/types/sanimationstate.md#name)`get` | | float [**NormalizedSpeed** ](/scripting/client-scripting-api-reference/types/sanimationstate.md#normalizedspeed)`get` `set` | | float [**NormalizedTime** ](/scripting/client-scripting-api-reference/types/sanimationstate.md#normalizedtime)`get` `set` | | float [**Speed** ](/scripting/client-scripting-api-reference/types/sanimationstate.md#speed)`get` `set` | | float [**Time** ](/scripting/client-scripting-api-reference/types/sanimationstate.md#time)`get` `set` | | float [**Weight** ](/scripting/client-scripting-api-reference/types/sanimationstate.md#weight)`get` `set` | #### Properties[​](#properties "Direct link to Properties") ##### Enabled[​](#enabled "Direct link to Enabled") bool **Enabled** `get` `set` *Is this Animation State enabled?* * Lua ```lua SAnimationState = Space.Host.ExecutingObject.Animation.GetState() SAnimationState.Enabled = false ``` ##### Length[​](#length "Direct link to Length") float **Length** `get` *Returns the length of current animation.* * Lua ```lua SAnimationState = Space.Host.ExecutingObject.Animation.GetState() length = SAnimationState.Length ``` ##### Name[​](#name "Direct link to Name") string **Name** `get` *Returns the name of current animation.* * Lua ```lua SAnimationState = Space.Host.ExecutingObject.Animation.GetState() name = SAnimationState.Name ``` ##### NormalizedSpeed[​](#normalizedspeed "Direct link to NormalizedSpeed") float **NormalizedSpeed** `get` `set` *Returns the normalized speed of current animation.* * Lua ```lua SAnimationState = Space.Host.ExecutingObject.Animation.GetState() normalizedSpeed = SAnimationState.NormalizedSpeed ``` ##### NormalizedTime[​](#normalizedtime "Direct link to NormalizedTime") float **NormalizedTime** `get` `set` *Returns the normalized time of current animation.* * Lua ```lua SAnimationState = Space.Host.ExecutingObject.Animation.GetState() normalizedTime = SAnimationState.NormalizedTime ``` ##### Speed[​](#speed "Direct link to Speed") float **Speed** `get` `set` *The playback speed of the animation. 1.0 is normal playback speed.* * Lua ```lua SAnimationState = Space.Host.ExecutingObject.Animation.GetState() SAnimationState.Speed = 0.5 ``` ##### Time[​](#time "Direct link to Time") float **Time** `get` `set` *Returns the Time of current animation.* * Lua ```lua SAnimationState = Space.Host.ExecutingObject.Animation.GetState() SAnimationState.Time = 0.5 ``` ##### Weight[​](#weight "Direct link to Weight") float **Weight** `get` `set` *Returns the Weight of current animation.* * Lua ```lua SAnimationState = Space.Host.ExecutingObject.Animation.GetState() SAnimationState.Weight = 0.5 ``` --- ### SAnimatorStateInfo #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | ------------------------------------------------------------------------------------------------------------- | | bool [**IsName** ](/scripting/client-scripting-api-reference/types/sanimatorstateinfo.md#isname)(string name) | | bool [**IsTag** ](/scripting/client-scripting-api-reference/types/sanimatorstateinfo.md#istag)(string tag) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ------------------------------------------------------------------------------------------------------------------------ | | int [**fullPathHash** ](/scripting/client-scripting-api-reference/types/sanimatorstateinfo.md#fullpathhash)`get` | | int [**nameHash** ](/scripting/client-scripting-api-reference/types/sanimatorstateinfo.md#namehash)`get` | | int [**shortNameHash** ](/scripting/client-scripting-api-reference/types/sanimatorstateinfo.md#shortnamehash)`get` | | float [**normalizedTime** ](/scripting/client-scripting-api-reference/types/sanimatorstateinfo.md#normalizedtime)`get` | | float [**length** ](/scripting/client-scripting-api-reference/types/sanimatorstateinfo.md#length)`get` | | float [**speed** ](/scripting/client-scripting-api-reference/types/sanimatorstateinfo.md#speed)`get` | | float [**speedMultiplier** ](/scripting/client-scripting-api-reference/types/sanimatorstateinfo.md#speedmultiplier)`get` | | int [**tagHash** ](/scripting/client-scripting-api-reference/types/sanimatorstateinfo.md#taghash)`get` | | bool [**loop** ](/scripting/client-scripting-api-reference/types/sanimatorstateinfo.md#loop)`get` | | float [**Length** ](/scripting/client-scripting-api-reference/types/sanimatorstateinfo.md#length)`get` | #### Functions[​](#functions "Direct link to Functions") ##### IsName[​](#isname "Direct link to IsName") bool **IsName** (string name) *Does name match the name of the active state in the statemachine?* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua AnimationStateInfo = Space.Host.ExecutingObject.Animator.GetCurrentAnimationStateInfo(0) AnimationStateInfo.isName("aStateName") ``` ##### IsTag[​](#istag "Direct link to IsTag") bool **IsTag** (string tag) *Does tag match the tag of the active state in the statemachine.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua AnimationStateInfo = Space.Host.ExecutingObject.Animator.GetCurrentAnimationStateInfo(0) AnimationStateInfo.isTag("aStateTag") ``` #### Properties[​](#properties "Direct link to Properties") ##### fullPathHash[​](#fullpathhash "Direct link to fullPathHash") int **fullPathHash** `get` *The full path hash for this state. The hash is generated using Animator.StringToHash.* * Lua ```lua AnimationStateInfo = Space.Host.ExecutingObject.Animator.GetCurrentAnimationStateInfo(0) fullPathHash = AnimationStateInfo.fullPathHash ``` ##### nameHash[​](#namehash "Direct link to nameHash") int **nameHash** `get` *The hashed name of the State.* * Lua ```lua AnimationStateInfo = Space.Host.ExecutingObject.Animator.GetCurrentAnimationStateInfo(0) nameHash= AnimationStateInfo.nameHash ``` ##### shortNameHash[​](#shortnamehash "Direct link to shortNameHash") int **shortNameHash** `get` *The hash is generated using SAnimator.StringToHash. The hash does not include the name of the parent layer.* * Lua ```lua AnimationStateInfo = Space.Host.ExecutingObject.Animator.GetCurrentAnimationStateInfo(0) shortNameHash= AnimationStateInfo.shortNameHash ``` ##### normalizedTime[​](#normalizedtime "Direct link to normalizedTime") float **normalizedTime** `get` *Normalized time of the State. The integer part is the number of time a state has been looped. The fractional part is the % (0-1) of progress in the current loop.* * Lua ```lua AnimationStateInfo = Space.Host.ExecutingObject.Animator.GetCurrentAnimationStateInfo(0) normalizedTime= AnimationStateInfo.normalizedTime ``` ##### length[​](#length "Direct link to length") float **length** `get` *Current duration of the state. In seconds Can vary when the State contains a Blend Tree.* * Lua ```lua AnimationStateInfo = Space.Host.ExecutingObject.Animator.GetCurrentAnimationStateInfo(0) length= AnimationStateInfo.length ``` ##### speed[​](#speed "Direct link to speed") float **speed** `get` *The playback speed of the animation. 1 is the normal playback speed. A negative playback speed will play the animation from the end.* * Lua ```lua AnimationStateInfo = Space.Host.ExecutingObject.Animator.GetCurrentAnimationStateInfo(0) speed= AnimationStateInfo.speed ``` ##### speedMultiplier[​](#speedmultiplier "Direct link to speedMultiplier") float **speedMultiplier** `get` \_The speed multiplier for this state. A negative speed multiplier will play the animation backwards. If no speed parameter as been set for this SAnimatorState, the default value will be 1.\_ * Lua ```lua AnimationStateInfo = Space.Host.ExecutingObject.Animator.GetCurrentAnimationStateInfo(0) speedMultiplier= AnimationStateInfo.speedMultiplier ``` ##### tagHash[​](#taghash "Direct link to tagHash") int **tagHash** `get` \_The Tag of the State. The hash is generated using SAnimator.StringToHash.\_ * Lua ```lua AnimationStateInfo = Space.Host.ExecutingObject.Animator.GetCurrentAnimationStateInfo(0) tagHash= AnimationStateInfo.tagHash ``` ##### loop[​](#loop "Direct link to loop") bool **loop** `get` *Is the state looping. All animations in the state must be looping.* * Lua ```lua AnimationStateInfo = Space.Host.ExecutingObject.Animator.GetCurrentAnimationStateInfo(0) loop= AnimationStateInfo.loop ``` ##### Length[​](#length-1 "Direct link to Length") float **Length** `get` *Current duration of the state. In seconds Can vary when the State contains a Blend Tree* * Lua ```lua AnimationStateInfo = Space.Host.ExecutingObject.Animator.GetCurrentAnimationStateInfo(0) Length= AnimationStateInfo.Length ``` --- ### SAvatar #### Functions[​](#functions "Direct link to Functions") ##### AttachTo[​](#attachto "Direct link to AttachTo") void **AttachTo** ([SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) target) *Attaches the player to the target game object, keeping the avatar fixed in its current position/rotation relative to the target object (e.g. for use in Vehicles)* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Scene.PlayerAvatar.AttachTo(targetObject) ``` * Lua ```lua --the below script makes the player Attach/Detach to/from this object by clicking it --(Example: Seat/Vehicle/Experience etc.. ) thisGameObject = Space.Host.ExecutingObject isAttached = 0 OnClick = function() if isAttached == 0 then Space.Scene.PlayerAvatar.AttachTo(thisGameObject) isAttached = 1 elseif isAttached == 1 then Space.Scene.PlayerAvatar.Detach() isAttached = 0 end end thisGameObject.AddClickable() thisGameObject.Clickable.Tooltip = "Click to Attach/Detach yourself to/from me" thisGameObject.Clickable.OnClick(OnClick) ``` ##### Detach[​](#detach "Direct link to Detach") void **Detach** () *Detaches the avatar from whatever it may be attached to (only works for the player avatar), including chairs, vehicles and so forth.* * Lua ```lua Space.Scene.PlayerAvatar.Detach() ``` * Lua ```lua --the below script makes the player Attach/Detach to/from this object by clicking it --(Example: Seat/Vehicle/Experience etc.. ) thisGameObject = Space.Host.ExecutingObject isAttached = 0 OnClick = function() if isAttached == 0 then Space.Scene.PlayerAvatar.AttachTo(thisGameObject) isAttached = 1 elseif isAttached == 1 then Space.Scene.PlayerAvatar.Detach() isAttached = 0 end end thisGameObject.AddClickable() thisGameObject.Clickable.Tooltip = "Click to Attach/Detach yourself to/from me" thisGameObject.Clickable.OnClick(OnClick) ``` ##### OnAvatarAttached[​](#onavatarattached "Direct link to OnAvatarAttached") void **OnAvatarAttached** () *An event which fires whenever this avatar is attached to a game object in the current scene.* * Lua ```lua function OAA() -- end Space.Scene.PlayerAvatar.OnAvatarAttached(OAA) ``` ##### OnAvatarDetached[​](#onavatardetached "Direct link to OnAvatarDetached") void **OnAvatarDetached** () *An event which fires whenever this avatar is detached from a game object in the current scene.* * Lua ```lua function OAD() -- end Space.Scene.PlayerAvatar.OnAvatarDetached(OAD) ``` ##### LoadOutfit[​](#loadoutfit "Direct link to LoadOutfit") void **LoadOutfit** (int outfitID) *Only works on a white-label deployment due to abuse concerns. Restrictions: The outfit ID needs to be one of the grid template outfits, with all the restrictions that apply to those (i.e. must use either SW content, or content uploaded by a grid admin account).* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local avatar=Space.Scene.PlayerAvatar avatar.LoadOutfit(10001) ``` * Lua ```lua --the below script changes the player's outfit into --a pre-defined outfit if they click the object containing the script --(Example: Player clicks on a wardrobe and their outfit changes) --[Only works on white-label deployment] thisGameObject = Space.Host.ExecutingObject OnClick = function() Space.Scene.PlayerAvatar.LoadOutfit(2662469) end thisGameObject.AddClickable() thisGameObject.Clickable.Tooltip = "Put on your favourite suit" thisGameObject.Clickable.OnClick(OnClick) ``` ##### ResetOutfit[​](#resetoutfit "Direct link to ResetOutfit") void **ResetOutfit** () *Reset current outfit. (white-label only)* * Lua ```lua Space.Scene.PlayerAvatar.ResetOutfit() ``` * Lua ```lua --Clicking this object will reset player avatar's outfit thisObject = Space.Host.ExecutingObject thisPlayer = Space.Scene.PlayerAvatar OnClick = function() thisPlayer.ResetOutfit() end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### Register[​](#register "Direct link to Register") void **Register** (string username, string password, string email, bool subscribeToSinespaceNewsletter=false, Closure onSuccess=null, Closure onError=null) *Allow a guest to register. (white-label only)* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local avatar=Space.Scene.PlayerAvatar avatar.Register("MyName","MyPassword","MyEmail",false,function () Space.Log("Success!") end,function () Space.Log("OnError!!") end) ``` ##### ResetOutfitToTemplate[​](#resetoutfittotemplate "Direct link to ResetOutfitToTemplate") void **ResetOutfitToTemplate** (int outfitID) *Reset current outfit to a specific template. (white-label only)* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local avatar=Space.Scene.PlayerAvatar avatar.ResetOutfitToTemplate(10001) ``` * Lua ```lua --Clicking this object will reset player avatar's outfit to a specific template. thisObject = Space.Host.ExecutingObject thisPlayer = Space.Scene.PlayerAvatar OnClick = function() thisPlayer.ResetOutfitToTemplate(10001) end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### FindBone[​](#findbone "Direct link to FindBone") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **FindBone** (string bone) *Retrieves the specified humanoid bone as an SGameObject. Requires a Humanoid rig; returns nil if the bone is missing or the avatar is non‑humanoid. The name is matched case‑insensitively against UnityEngine.HumanBodyBones.* | Parameter | Type | Description | | --------- | ------ | -------------------------------------------------------------------------------------------- | | bone | string | Name of a UnityEngine.HumanBodyBones value (case‑insensitive), e.g., "LeftShoulder", "Head". | * Lua ```lua -- Humanoid models only. Pass a UnityEngine.HumanBodyBones name. local bone = Space.Scene.PlayerAvatar.FindBone("LeftShoulder") Space.Log(bone.Name) -- Prints the bone name of the corresponding search parameter; on default avatars, prints "LeftShoulder" --[[ UnityEngine.HumanBodyBones values Body: Hips, Spine, Chest, UpperChest Head: Neck, Jaw, Head, LeftEye, RightEye Left Arm: LeftShoulder, LeftUpperArm, LeftLowerArm, LeftHand Left Leg: LeftUpperLeg, LeftLowerLeg, LeftFoot, LeftToes Right Arm: RightShoulder, RightUpperArm, RightLowerArm, RightHand Right Leg: RightUpperLeg, RightLowerLeg, RightFoot, RightToes Left Hand (Thumb): LeftThumbProximal, LeftThumbIntermediate, LeftThumbDistal Left Hand (Index): LeftIndexProximal, LeftIndexIntermediate, LeftIndexDistal Left Hand (Middle): LeftMiddleProximal, LeftMiddleIntermediate, LeftMiddleDistal Left Hand (Ring): LeftRingProximal, LeftRingIntermediate, LeftRingDistal Left Hand (Little): LeftLittleProximal, LeftLittleIntermediate, LeftLittleDistal Right Hand (Thumb): RightThumbProximal, RightThumbIntermediate, RightThumbDistal Right Hand (Index): RightIndexProximal, RightIndexIntermediate, RightIndexDistal Right Hand (Middle): RightMiddleProximal, RightMiddleIntermediate, RightMiddleDistal Right Hand (Ring): RightRingProximal, RightRingIntermediate, RightRingDistal Right Hand (Little): RightLittleProximal, RightLittleIntermediate, RightLittleDistal ]] ``` * Lua ```lua --this script will set your avatar's "right hand" as parent of this object --this way this object will be a child of your right hand and therefore move with it --(Example: clicking on a gun to equip it) thisGameObject = Space.Host.ExecutingObject OnClick = function() RightHand = Space.Scene.PlayerAvatar.FindBone("RightHand") thisGameObject.SetParent(RightHand) thisGameObject.LocalPosition = Vector.New(0,0,0) -- resetting position to match hand end thisGameObject.AddClickable() thisGameObject.Clickable.Tooltip="Click to Equip " thisGameObject.Clickable.OnClick(OnClick) ``` ##### Teleport[​](#teleport "Direct link to Teleport") void **Teleport** (string landmarkName)
void **Teleport** ([SVector](/scripting/client-scripting-api-reference/types/svector.md) position)
void **Teleport** ([SVector](/scripting/client-scripting-api-reference/types/svector.md) position, [SQuaternion](/scripting/client-scripting-api-reference/types/squaternion.md) rotation)
void **Teleport** (int region)
void **Teleport** (int region, [SVector](/scripting/client-scripting-api-reference/types/svector.md) position, [SQuaternion](/scripting/client-scripting-api-reference/types/squaternion.md) rotation) *Teleport the avatar.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Scene.PlayerAvatar.Teleport("MyLandMark") --or Space.Scene.PlayerAvatar.Teleport( Vector.New(0,0,0) ) --or Space.Scene.PlayerAvatar.Teleport( Vector.New(0,0,0), Quaternion.New(0,0,0) ) --or Space.Scene.PlayerAvatar.Teleport( 5432342) --or Space.Scene.PlayerAvatar.Teleport( 5432342, Vector.New(0,0,0), Quaternion.New(0,0,0) ) ``` * Lua ```lua --the below script teleports player to a specific landmark --if they click the object containing it --(Example: A region promotional/advertisement sign) --[You need a landmark in the scene with name "Fashion Section Landmark" thisGameObject = Space.Host.ExecutingObject OnClick = function() Space.Scene.PlayerAvatar.Teleport("Fashion Section Landmark") end thisGameObject.AddClickable() thisGameObject.Clickable.Tooltip = "Click me to go to the fashion section!" thisGameObject.Clickable.OnClick(OnClick) ``` ##### SetIKGoal[​](#setikgoal "Direct link to SetIKGoal") void **SetIKGoal** (string goal, bool positionGoal, float positionStrength, [SVector](/scripting/client-scripting-api-reference/types/svector.md) positionTarget, bool rotationGoal, float rotationStrength, [SQuaternion](/scripting/client-scripting-api-reference/types/squaternion.md) rotationTarget) *Set the IK goal to avatar.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua avatar=Space.Scene.PlayerAvatar pos=avatar.FindBone("Chest").WorldPosition avatar.SetIKGoal("Chest",false,0,pos,true,20,Quaternion.Euler(0,60,0)) ``` ##### ClearIKGoal[​](#clearikgoal "Direct link to ClearIKGoal") void **ClearIKGoal** (string goal) *Clear the IK Goal.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua avatar=Space.Scene.PlayerAvatar pos=avatar.FindBone("Chest").WorldPosition avatar.SetIKGoal("Chest",false,0,pos,true,20,Quaternion.Euler(0,60,0)) Space.Host.InvokeDelayed(function () avatar.ClearIKGoal("Chest") end,5) -- will clear after 5 seconds. ``` ##### PlayCustomAnimation[​](#playcustomanimation "Direct link to PlayCustomAnimation") void **PlayCustomAnimation** ([SResource](/scripting/client-scripting-api-reference/types/sresource.md) animationClip) *Play a custom animation on the avatar.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Scene.PlayerAvatar.PlayCustomAnimation(Space.Resources[1]) ``` * Lua ```lua --the below script makes the player Play/Stop a custom animation when clicking this object --(Example: Dance Machine ) --[Required: Place an animation in the first "Resource" in the scripting runtime] thisGameObject = Space.Host.ExecutingObject isDancing = 0 OnClick = function() if isDancing == 0 then Space.Scene.PlayerAvatar.PlayCustomAnimation(Space.Resources[1]) isDancing = 1 elseif isDancing == 1 then Space.Scene.PlayerAvatar.StopCustomAnimation() isDancing = 0 end end thisGameObject.AddClickable() thisGameObject.Clickable.Tooltip = "Click to Start/Stop dancing" thisGameObject.Clickable.OnClick(OnClick) ``` ##### StopCustomAnimation[​](#stopcustomanimation "Direct link to StopCustomAnimation") void **StopCustomAnimation** () *Make the avatar stops playing custom animation.* * Lua ```lua avatar=Space.Scene.PlayerAvatar avatar.PlayCustomAnimation(Space.Resources[1]) avatar.StopCustomAnimation() ``` * Lua ```lua --the below script makes the player Play/Stop a custom animation when clicking this object --(Example: Dance Machine ) --[Required: Place an animation in the first "Resource" in the scripting runtime] thisGameObject = Space.Host.ExecutingObject isDancing = 0 OnClick = function() if isDancing == 0 then Space.Scene.PlayerAvatar.PlayCustomAnimation(Space.Resources[1]) isDancing = 1 elseif isDancing == 1 then Space.Scene.PlayerAvatar.StopCustomAnimation() isDancing = 0 end end thisGameObject.AddClickable() thisGameObject.Clickable.Tooltip = "Click to Start/Stop dancing" thisGameObject.Clickable.OnClick(OnClick) ``` ##### OnAvatarReload[​](#onavatarreload "Direct link to OnAvatarReload") void **OnAvatarReload** (Closure o) *This event will be called when the avatar gets loaded.* | Parameter | Type | Description | | --------- | ------------------ | -------------------------------------------------------------------------- | | o | Closure (callback) | A function that will be called once the OnAvatarReload event is triggered. | * Lua ```lua local avatar=Space.Scene.PlayerAvatar avatar.OnAvatarReload(function () Space.Log(avatar.OutfitID) end) ``` * Lua ```lua --this script ensures the avatar is still animating after their avatar gets reloaded thisPlayer = Space.Scene.PlayerAvatar theAnimation = Space.GetResource("The Animation") --add animation to resources in Scripting Runtime wasAnimated = true --you'll need to set this according to the situation, its true now for example's sake ResetDance = function() if wasAnimated then thisPlayer.PlayCustomAnimation(theAnimation) end end thisPlayer.OnAvatarReload(ResetDance) ``` ##### SynchroniseState[​](#synchronisestate "Direct link to SynchroniseState") void **SynchroniseState** () *Synchronise avatar's state to network.* * Lua ```lua Space.Scene.PlayerAvatar.SynchroniseState() ``` ##### StartFly[​](#startfly "Direct link to StartFly") void **StartFly** () *Puts the avatar into Fly Mode.* * Lua ```lua Space.Scene.PlayerAvatar.StartFly() ``` * Lua ```lua --the below script teleports the player to a sky location after he clicks --but then immediately puts the character in fly mode so they don't fall back down --(Example: Sky exhibit) thisGameObject = Space.Host.ExecutingObject OnClick = function() Space.Scene.PlayerAvatar.Teleport(Vector.New(0,10,0)) Space.Scene.PlayerAvatar.StartFly() end thisGameObject.AddClickable() thisGameObject.Clickable.Tooltip = "Click me to view our sky exhibit!" thisGameObject.Clickable.OnClick(OnClick) ``` ##### EndFly[​](#endfly "Direct link to EndFly") void **EndFly** () *Exits Avatar out of Fly Mode* * Lua ```lua Space.Scene.PlayerAvatar.EndFly() ``` * Lua ```lua --the below script teleports a player flying in the sky back to the ground --and then ends fly mode by switching to Idle so they remain standing --(Example: Going back down to ground from Sky exhibit) thisGameObject = Space.Host.ExecutingObject OnClick = function() Space.Scene.PlayerAvatar.Teleport(Vector.New(0,0,0)) Space.Scene.PlayerAvatar.EndFly() end thisGameObject.AddClickable() thisGameObject.Clickable.Tooltip = "Click me to go back to the ground!" thisGameObject.Clickable.OnClick(OnClick) ``` ##### OnAvatarSkeletonReload[​](#onavatarskeletonreload "Direct link to OnAvatarSkeletonReload") void **OnAvatarSkeletonReload** (Closure o) *This event will be called when the avatar skeleton gets loaded.* | Parameter | Type | Description | | --------- | ------------------ | ---------------------------------------------------------------------------------- | | o | Closure (callback) | A function that will be called once the OnAvatarSkeletonReload event is triggered. | * Lua ```lua avatar=Space.Scene.PlayerAvatar Space.Log(avatar.BlockJump) avatar.OnAvatarSkeletonReload(function () Space.Log(avatar.OutfitID) end) ``` * Lua ```lua --this script ensures the avatar is still animating after their avatar's skeleton gets reloaded thisPlayer = Space.Scene.PlayerAvatar theAnimation = Space.GetResource("The Animation") --add animation to resources in Scripting Runtime wasAnimated = true --you'll need to set this according to the situation, its true now for example's sake ResetDance = function() if wasAnimated then thisPlayer.PlayCustomAnimation(theAnimation) end end thisPlayer.OnAvatarSkeletonReload(ResetDance) ``` ##### TeleportToNextEvent[​](#teleporttonextevent "Direct link to TeleportToNextEvent") double **TeleportToNextEvent** (long withinSeconds=600) *Teleports to the region of the next scheduled event if it starts within the given time window. Returns 0 if a teleport occurs; returns the number of seconds until the next event if it is outside the cutoff; returns -1 if there are no upcoming events.* | Parameter | Type | Description | | ------------- | ---- | --------------------------------------------------------------------- | | withinSeconds | long | Maximum seconds ahead to consider for auto-teleport. Defaults to 600. | * Lua ```lua timeUntilNextEvent = Space.Scene.PlayerAvatar.TeleportToNextEvent() --or timeUntilNextEvent = Space.Scene.PlayerAvatar.TeleportToNextEvent(500) ``` #### Properties[​](#properties "Direct link to Properties") ##### Username[​](#username "Direct link to Username") string **Username** `get` *Returns the avatar's current username (note: this can be changed by players for a small fee)* * Lua ```lua playerUsername = Space.Scene.PlayerAvatar.Username ``` * Lua ```lua --this script, once clicked, will get all avatars in the scene --and print their Username(including self) --(Example: scoreboards/radars/scanners/game machines) thisGameObject = Space.Host.ExecutingObject OnClick = function() allAvatars = Space.Scene.AllAvatars for var=1, #allAvatars do local Username = allAvatars[var].Username Space.Log("Username: " .. Username) end end thisGameObject.AddClickable() thisGameObject.Clickable.Tooltip = "Click to print all avatars' Username" thisGameObject.Clickable.OnClick(OnClick) ``` ##### DisplayName[​](#displayname "Direct link to DisplayName") string **DisplayName** `get` *Returns the avatar's display name (falls back to Username if unset).* * Lua ```lua playerDisplayName = Space.Scene.PlayerAvatar.DisplayName ``` ##### Title[​](#title "Direct link to Title") string **Title** `get` *Returns the avatar's current title* * Lua ```lua playerTitle = Space.Scene.PlayerAvatar.Title ``` * Lua ```lua --this script, once clicked, will get all avatars in the scene --and print their Title and Username(including self) thisGameObject = Space.Host.ExecutingObject OnClick = function() allAvatars = Space.Scene.AllAvatars for var=1, #allAvatars do local Username = allAvatars[var].Username local Title = allAvatars[var].Title Space.Log(Title .. " " .. Username) end end thisGameObject.AddClickable() thisGameObject.Clickable.Tooltip = "Click to print all avatars' Titles and Username" thisGameObject.Clickable.OnClick(OnClick) ``` ##### OrgTitle[​](#orgtitle "Direct link to OrgTitle") string **OrgTitle** `get` *Returns the user's organizational job title (JobTitle).* * Lua ```lua playerJobTitle = Space.Scene.PlayerAvatar.OrgTitle ``` ##### OrgName[​](#orgname "Direct link to OrgName") string **OrgName** `get` *Returns the user's organization/company name (Company).* * Lua ```lua playerCompanyName = Space.Scene.PlayerAvatar.OrgName ``` ##### ID[​](#id "Direct link to ID") long **ID** `get` *Returns the avatar's user ID, please note if you store these, this is a 'long' value not a 'int'.* * Lua ```lua playerID = Space.Scene.PlayerAvatar.ID ``` * Lua ```lua --this script, once clicked, will get all avatars in the scene --and print their ID(including self) --(Example: scoreboards/radars/scanners/game machines) thisGameObject = Space.Host.ExecutingObject OnClick = function() allAvatars = Space.Scene.AllAvatars for var=1, #allAvatars do local ID = allAvatars[var].ID Space.Log("ID: " .. ID) end end thisGameObject.AddClickable() thisGameObject.Clickable.Tooltip = "Click to print all avatars' ID" thisGameObject.Clickable.OnClick(OnClick) ``` ##### IsAttached[​](#isattached "Direct link to IsAttached") bool **IsAttached** `get` *Returns True if avatar is Attached* * Lua ```lua isAttached = Space.Scene.PlayerAvatar.IsAttached ``` ##### MovementSpeed[​](#movementspeed "Direct link to MovementSpeed") float **MovementSpeed** `get` `set` *How fast the avatar's movement is* * Lua ```lua Space.Scene.PlayerAvatar.MovementSpeed = 20 ``` * Lua ```lua --the below script makes the object give the player triple movement speed --once it's clicked, and then returns them to original speed after 10 seconds --(Example: Triple Speed Powerup (avatar running race)) thisGameObject = Space.Host.ExecutingObject TripleSpeedCoroutine = function() local originalSpeed = Space.Scene.PlayerAvatar.MovementSpeed Space.Scene.PlayerAvatar.MovementSpeed = originalSpeed * 3 coroutine.yield(10) Space.Scene.PlayerAvatar.MovementSpeed = originalSpeed end OnClick = function() Space.Host.StartCoroutine(TripleSpeedCoroutine) end thisGameObject.AddClickable() thisGameObject.Clickable.Tooltip = "Triple Speed Powerup!" thisGameObject.Clickable.OnClick(OnClick) ``` ##### JumpHeight[​](#jumpheight "Direct link to JumpHeight") float **JumpHeight** `get` `set` *How high the avatar's jump is* * Lua ```lua Space.Scene.PlayerAvatar.JumpHeight = 20 ``` * Lua ```lua --the below script makes the object give the player triple jump height --once it's clicked, and then returns them to original jump height after 10 seconds --(Example: Triple Jump Height Powerup ) thisGameObject = Space.Host.ExecutingObject originalJumpHeight = Space.Scene.PlayerAvatar.JumpHeight TripleJumpHeightCoroutine = function() Space.Scene.PlayerAvatar.JumpHeight = originalJumpHeight * 3 coroutine.yield(10) Space.Scene.PlayerAvatar.JumpHeight = originalJumpHeight end OnClick = function() Space.Host.StartCoroutine(TripleJumpHeightCoroutine) end thisGameObject.AddClickable() thisGameObject.Clickable.Tooltip = "Triple JumpHeight Powerup!" thisGameObject.Clickable.OnClick(OnClick) ``` ##### Guest[​](#guest "Direct link to Guest") bool **Guest** `get` *Is this Avatar a Guest?* * Lua ```lua isGuest = Space.Scene.PlayerAvatar.Guest ``` * Lua ```lua --this script will make this object non-clickable for guest players thisObject = Space.Host.ExecutingObject thisPlayer = Space.Scene.PlayerAvatar OnClick = function() Space.Log("Do Something") end if not thisPlayer.Guest then --if player is not guest thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) end ``` ##### OutfitID[​](#outfitid "Direct link to OutfitID") long **OutfitID** `get` *Returns the current outfit ID of the avatar* * Lua ```lua avOutfit = Space.Scene.PlayerAvatar.OutfitID ``` ##### Loaded[​](#loaded "Direct link to Loaded") bool **Loaded** `get` *Returns true if avatar is Loaded* * Lua ```lua isLoaded = Space.Scene.PlayerAvatar.Loaded ``` * Lua ```lua --this script will wait for a joining avatar to load first before making it play an animation --(otherwise that animation may be reset if played before load is complete) NewJoinAnimation = Space.GetResource("The Animation") OnPlayerJoin = function(NewAvatar) Space.Host.StartCoroutine(function() while not NewAvatar.Loaded do coroutine.yield(0) end --makes it wait Space.Log("yes") NewAvatar.PlayCustomAnimation(NewJoinAnimation) --at this point Loaded is True end) end Space.Scene.OnPlayerJoin(OnPlayerJoin) ``` ##### Gender[​](#gender "Direct link to Gender") string **Gender** `get` *Returns the avatar's gender as a string (e.g., "Male", "Female").* * Lua ```lua playerGender = Space.Scene.PlayerAvatar.Gender ``` ##### LockObject[​](#lockobject "Direct link to LockObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **LockObject** `get` *The object the Avatar is* [*Attached*](/scripting/client-scripting-api-reference/types/savatar.md#attachto) *to. Returns **Null** if Avatar is not attached.* * Lua ```lua lockObject = Space.Scene.PlayerAvatar.LockObject ``` ##### Skeleton[​](#skeleton "Direct link to Skeleton") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **Skeleton** `get` *Returns a reference to avatar's skeleton GameObject* * Lua ```lua avSkeleton = Space.Scene.PlayerAvatar.Skeleton ``` * Lua ```lua --clicking this object will replace your avatar's animator controller (found on the skeleton) thisObject = Space.Host.ExecutingObject thisPlayer = Space.Scene.PlayerAvatar customController = Space.GetResource("animcont") OnClick = function() thisPlayer.Skeleton.Animator.Controller = customController end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### BlockMovement[​](#blockmovement "Direct link to BlockMovement") bool **BlockMovement** `get` `set` *If set to True, avatar's movement will be blocked* * Lua ```lua Space.Scene.PlayerAvatar.BlockMovement = true ``` * Lua ```lua --the below script makes this object a boundary area where any user entering it --will be blocked from movement for 20 seconds, then the object will release controls and --destroy itself after that --(Example: freezing trap) --[This object's collider needs to be set as IsTrigger (Please read about OnTriggerStart for troubleshooting)] thisGameObject = Space.Host.ExecutingObject FrozenTime = 0.0 OnTriggerStart = function(TriggerStarter) if TriggerStarter.Root.Avatar ~= nil then if TriggerStarter.Root.Avatar.Username == Space.Scene.PlayerAvatar.Username then Space.Scene.PlayerAvatar.BlockMovement = true end end end OnTriggerStay = function(TriggerStayer) if TriggerStayer.Root.Avatar ~= nil then if TriggerStayer.Root.Avatar.Username == Space.Scene.PlayerAvatar.Username then FrozenTime = FrozenTime + Space.DeltaTime if FrozenTime > 20 then Space.Scene.PlayerAvatar.BlockMovement = false thisGameObject.Destroy() end end end end thisGameObject.SubscribeToEvents() thisGameObject.OnTriggerStart(OnTriggerStart) thisGameObject.OnTriggerStay(OnTriggerStay) ``` ##### BlockRun[​](#blockrun "Direct link to BlockRun") bool **BlockRun** `get` `set` *Is the Avatar blocked from running?* * Lua ```lua Space.Scene.PlayerAvatar.BlockRun = true ``` * Lua ```lua --this script will block a player's run ability when entering trigger collider and release it when leaving --[Requires this object to have a "Trigger" collider] thisObject = Space.Host.ExecutingObject thisPlayer = Space.Scene.PlayerAvatar OTS = function(gameObject) if gameObject.Avatar ~= nil and thisPlayer == gameObject.Avatar then thisPlayer.BlockRun = true end end OTE = function(gameObject) if gameObject.Avatar ~= nil and thisPlayer == gameObject.Avatar then thisPlayer.BlockRun = false end end thisObject.OnTriggerStart(OTS) thisObject.OnTriggerExit(OTE) ``` ##### BlockFly[​](#blockfly "Direct link to BlockFly") bool **BlockFly** `get` `set` *Is the Avatar blocked from flying?* * Lua ```lua Space.Scene.PlayerAvatar.BlockFly = true ``` * Lua ```lua --this script will block a player's fly ability when entering trigger collider and release it when leaving --[Requires this object to have a "Trigger" collider] thisObject = Space.Host.ExecutingObject thisPlayer = Space.Scene.PlayerAvatar OTS = function(gameObject) if gameObject.Avatar ~= nil and thisPlayer == gameObject.Avatar then thisPlayer.BlockFly = true end end OTE = function(gameObject) if gameObject.Avatar ~= nil and thisPlayer == gameObject.Avatar then thisPlayer.BlockFly = false end end thisObject.OnTriggerStart(OTS) thisObject.OnTriggerExit(OTE) ``` ##### BlockCrouch[​](#blockcrouch "Direct link to BlockCrouch") bool **BlockCrouch** `get` `set` *Is the Avatar blocked from crouching?* * Lua ```lua Space.Scene.PlayerAvatar.BlockCrouch = true ``` * Lua ```lua --this script will block a player's crouch ability when entering trigger collider and release it when leaving --[Requires this object to have a "Trigger" collider] thisObject = Space.Host.ExecutingObject thisPlayer = Space.Scene.PlayerAvatar OTS = function(gameObject) if gameObject.Avatar ~= nil and thisPlayer == gameObject.Avatar then thisPlayer.BlockCrouch = true end end OTE = function(gameObject) if gameObject.Avatar ~= nil and thisPlayer == gameObject.Avatar then thisPlayer.BlockCrouch = false end end thisObject.OnTriggerStart(OTS) thisObject.OnTriggerExit(OTE) ``` ##### BlockJump[​](#blockjump "Direct link to BlockJump") bool **BlockJump** `get` `set` *Is the Avatar blocked from jumping?* * Lua ```lua Space.Scene.PlayerAvatar.BlockJump = true ``` * Lua ```lua --this script will block a player's jump ability when entering trigger collider and release it when leaving --[Requires this object to have a "Trigger" collider] thisObject = Space.Host.ExecutingObject thisPlayer = Space.Scene.PlayerAvatar OTS = function(gameObject) if gameObject.Avatar ~= nil and thisPlayer == gameObject.Avatar then thisPlayer.BlockJump= true end end OTE = function(gameObject) if gameObject.Avatar ~= nil and thisPlayer == gameObject.Avatar then thisPlayer.BlockJump= false end end thisObject.OnTriggerStart(OTS) thisObject.OnTriggerExit(OTE) ``` ##### IsGrounded[​](#isgrounded "Direct link to IsGrounded") bool **IsGrounded** `get` *Returns True if avatar is Grounded* * Lua ```lua isGrounded = Space.Scene.PlayerAvatar.IsGrounded ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *The reference to the Avatar's GameObject* * Lua ```lua playerObject = Space.Scene.PlayerAvatar.GameObject ``` * Lua ```lua --Clicking this object will teleport you 2 units forward and make you face the opposite way thisObject = Space.Host.ExecutingObject thisPlayer = Space.Scene.PlayerAvatar OnClick = function() local targetPos = thisPlayer.GameObject.WorldPosition + (thisPlayer.GameObject.Forward * 2) local targetRot = thisPlayer.GameObject.WorldRotation * Quaternion.AngleAxis(Vector.Up, 180) thisPlayer.Teleport(targetPos, targetRot) end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` --- ### SAvatarAppearance #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | ------------------------------------------------------------------------------------------------------------------------------------------- | | void [**LoadOutfit** ](/scripting/client-scripting-api-reference/types/savatarappearance.md#loadoutfit)(int outfitID) | | void [**ResetOutfit** ](/scripting/client-scripting-api-reference/types/savatarappearance.md#resetoutfit)() | | void [**ResetOutfitToTemplate** ](/scripting/client-scripting-api-reference/types/savatarappearance.md#resetoutfittotemplate)(int outfitID) | | float [**GetSlider** ](/scripting/client-scripting-api-reference/types/savatarappearance.md#getslider)(SAppearanceSlider slider) | | float [**GetHeight** ](/scripting/client-scripting-api-reference/types/savatarappearance.md#getheight)() | | SColor [**GetSkinTone** ](/scripting/client-scripting-api-reference/types/savatarappearance.md#getskintone)() | | SColor [**GetEyeTone** ](/scripting/client-scripting-api-reference/types/savatarappearance.md#geteyetone)() | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ------------------------------------------------------------------------------------------------------------------- | | long [**OutfitID** ](/scripting/client-scripting-api-reference/types/savatarappearance.md#outfitid)`get` | | SGameObject [**Skeleton** ](/scripting/client-scripting-api-reference/types/savatarappearance.md#skeleton)`get` | | bool [**Loaded** ](/scripting/client-scripting-api-reference/types/savatarappearance.md#loaded)`get` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/types/savatarappearance.md#gameobject)`get` | #### Functions[​](#functions "Direct link to Functions") ##### LoadOutfit[​](#loadoutfit "Direct link to LoadOutfit") void **LoadOutfit** (int outfitID) *Changes the current Avatar's outfit to outfitID. For a player Avatar, this only works on white-label grid. For NPC avatars, this works on all grids.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.AvatarAppearance.LoadOutfit(160) ``` * Lua ```lua --this script toggles between 3 different outfits when NPC Statue object is clicked --[Object needs to have an NPC Statue component] outfits = {4134388, 4134385, 4134386} currentOutfit = 0 thisObject = Space.Host.ExecutingObject function OnClickFunction() if currentOutfit == #outfits then currentOutfit = 1 else currentOutfit = currentOutfit + 1 end thisObject.AvatarAppearance.LoadOutfit(outfits[currentOutfit]) end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### ResetOutfit[​](#resetoutfit "Direct link to ResetOutfit") void **ResetOutfit** () *Changes the current Avatar's outfit and resets it to outfitID 0. For a player Avatar, this only works on white-label grid. For NPC avatars, this works on all grids.* * Lua ```lua Space.Host.ExecutingObject.AvatarAppearance.ResetOutfit() ``` * Lua ```lua --this script makes a UIButton reset an NPC statue outfit when clicked --[UIButton object needs to be linked in scripting runtime references with name "button1"] --[Object needs to have an NPC Statue component] thisObject = Space.Host.ExecutingObject refButton = Space.Host.GetReference("button1") function OnClickFunction() thisObject.AvatarAppearance.ResetOutfit() end refButton.UIButton.OnClick(OnClickFunction) ``` ##### ResetOutfitToTemplate[​](#resetoutfittotemplate "Direct link to ResetOutfitToTemplate") void **ResetOutfitToTemplate** (int outfitID) *Changes the current Avatar's outfit to outfitID only if the player running this code already owns that outfit. For a player Avatar, this only works on white-label grid. For NPC avatars, this works on all grids.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.AvatarAppearance.ResetOutfitToTemplate(10001) ``` * Lua ```lua --this script toggles between 3 different outfits when NPC Statue object is clicked --[Object needs to have an NPC Statue component] --For this function, the player needs to own this outfit. Use LoadOutfit if player might not own it outfits = {4134388, 4134385, 4134386} currentOutfit = 0 thisObject = Space.Host.ExecutingObject function OnClickFunction() if currentOutfit == #outfits then currentOutfit = 1 else currentOutfit = currentOutfit + 1 end thisObject.AvatarAppearance.ResetOutfitToTemplate(outfits[currentOutfit]) end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### GetSlider[​](#getslider "Direct link to GetSlider") float **GetSlider** (int slider) *Return the value of Appearance Sliders.* | Parameter | Type | Description | | --------- | ---- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | slider | int | 1= Asian, 2= European, 3= African, 4= FaceShape, 5= FaceWidth, 6= FaceLength, 7= ForeheadShape, 8= ForeheadDepth, 9= CheekHeight, 10= CheekWidth, 11= JawShape, 12= JawWidth, 13= JawHeight, 14= EyebrowHeight, 15= EyebrowDepth, 16= EyeHeight, 17= EyeSpacing, 18= EyeSize, 19= EyeWidth, 20= EyeballSize, 21= EyeInside, 22= EyeOutside, 23= EyelashLength, 24= NoseWidth, 25= NoseDepth, 26= NoseHeight, 27= NoseShape, 28= NoseTipShape, 29= NostrilWidth, 30= MouthWidth, 31= MouthHeight, 32= MouthDepth, 33= UpperLipWidth, 34= UpperLipThickness, 35= LowerLipWidth, 36= LowerLipThickness, 37= Smile, 38= EarHeight, 39= EarWidth, 40= Earlobe, 41= EarShape, 42= Muscular, 43= Toned, 44= Grand, 45= Lean, 46= SkullHeight, 47= SkullWidth, 48= SkullDepth, 49= NeckThickness, 50= ShoulderThickness, 51= UpperArmThickness, 52= ForearmThickness, 53= WristSize, 54= ElbowThin, 55= HandThickness, 56= HandTone, 57= FingerWidth, 58= BustProximity, 59= BustSize, 60= ChestDepth, 61= PectoralSize, 62= PectoralHeight, 63= AbdomenMiddle, 64= AbdomenDepth, 65= WaistWidth, 66= HipSize, 67= GlutesSize, 68= GlutesHeight, 69= LoveHandles, 70= ThighSize, 71= KneeTone, 72= ShinSize, 73= AnkleTone, 74= FootThickness, 75= FootTone, 76= ToeWidth, 77= HeadSize, 78= NeckSize, 79= ShoulderSize, 80= UpperArmSize, 81= ForearmSize, 82= HandSize, 83= SpineSize, 84= ChestSize, 85= UpperLegSize, 86= LowerLegSize, 87= FeetSize, 88= ToesSize, 89= HeadPosition, 90= NeckLength, 91= ForearmLength, 92= HandPosition, 93= SpineLength, 94= ChestLength, 95= UpperLegLength, 96= LowerLegLength, 97= FeetLength, 98= ToesLength, 99= ShoulderHeight, 100= ShoulderWidth, 101= FeetFloorOffset | * Lua ```lua FaceLength = Space.Host.ExecutingObject.AvatarAppearance.GetSlider(AppearanceSlider.FaceLength) ``` * Lua ```lua --this script updates a UIText with the current Face Length of the npc thisObject = Space.Host.ExecutingObject uiText = Space.Host.GetReference("thetext").UIText --Add this object with UIText component as reference in Scripting Runtime OnUpdateFunction = function() uiText.Text = thisObject.AvatarAppearance.GetSlider(AppearanceSlider.FaceLength) end thisObject.OnUpdate(OnUpdateFunction) ``` ##### GetHeight[​](#getheight "Direct link to GetHeight") float **GetHeight** () *Return height of avatar.* * Lua ```lua height = Space.Host.ExecutingObject.AvatarAppearance.GetHeight() ``` * Lua ```lua --this script updates a UIText with the height of this NPC statue thisObject = Space.Host.ExecutingObject uiText = Space.Host.GetReference("thetext").UIText --Add this object with UIText component as reference in Scripting Runtime OnUpdateFunction = function() uiText.Text = thisObject.AvatarAppearance.GetHeight() end thisObject.OnUpdate(OnUpdateFunction) ``` ##### GetSkinTone[​](#getskintone "Direct link to GetSkinTone") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **GetSkinTone** () *Return skin tone of avatar.* * Lua ```lua SkinTone = Space.Host.ExecutingObject.AvatarAppearance.GetSkinTone() ``` * Lua ```lua --this script updates a UIText with the current Skin Tone of the npc thisObject = Space.Host.ExecutingObject uiText = Space.Host.GetReference("thetext").UIText --Add this object with UIText component as reference in Scripting Runtime OnUpdateFunction = function() uiText.Text = thisObject.AvatarAppearance.GetSkinTone().ToString() end thisObject.OnUpdate(OnUpdateFunction) ``` ##### GetEyeTone[​](#geteyetone "Direct link to GetEyeTone") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **GetEyeTone** () *Return eye tone of avatar.* * Lua ```lua EyeTone = Space.Host.ExecutingObject.AvatarAppearance.GetEyeTone() ``` * Lua ```lua --this script updates a UIText with the current Eye Tone of the npc thisObject = Space.Host.ExecutingObject uiText = Space.Host.GetReference("thetext").UIText --Add this object with UIText component as reference in Scripting Runtime OnUpdateFunction = function() uiText.Text = thisObject.AvatarAppearance.GetEyeTone().ToString() end thisObject.OnUpdate(OnUpdateFunction) ``` #### Properties[​](#properties "Direct link to Properties") ##### OutfitID[​](#outfitid "Direct link to OutfitID") long **OutfitID** `get` *Return the current outfit id.* * Lua ```lua outfitID= Space.Host.ExecutingObject.AvatarAppearance.OutfitID ``` * Lua ```lua --this script updates a UIText with the current outfit ID of the npc thisObject = Space.Host.ExecutingObject uiText = Space.Host.GetReference("thetext").UIText --Add this object with UIText component as reference in Scripting Runtime OnUpdateFunction = function() uiText.Text = thisObject.GameObject.AvatarAppearance.OutfitID end thisObject.OnUpdate(OnUpdateFunction) ``` ##### Skeleton[​](#skeleton "Direct link to Skeleton") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **Skeleton** `get` *Return the GameObject of avatar skeleton.* * Lua ```lua playerSkeleton = Space.Host.ExecutingObject.AvatarAppearance.Skeleton ``` ##### Loaded[​](#loaded "Direct link to Loaded") bool **Loaded** `get` *Returns true if the avatar is full loaded.* * Lua ```lua isLoaded= Space.Host.ExecutingObject.AvatarAppearance.Loaded ``` * Lua ```lua --this script updates a UIText with the loading status of the npc thisObject = Space.Host.ExecutingObject uiText = Space.Host.GetReference("thetext").UIText --Add this object with UIText component as reference in Scripting Runtime OnUpdateFunction = function() uiText.Text = thisObject.AvatarAppearance.Loaded end thisObject.OnUpdate(OnUpdateFunction) ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Property Description* * Lua ```lua npcGameObject = Space.Host.ExecutingObject.AvatarAppearance.GameObject ``` --- ### SChatMessage #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Attribute Name | | --------------------------------------------------------------------------------------------------- | | uint [**SenderID** ](/scripting/client-scripting-api-reference/types/schatmessage.md#senderid)`get` | | string [**Sender** ](/scripting/client-scripting-api-reference/types/schatmessage.md#sender)`get` | | string [**Channel** ](/scripting/client-scripting-api-reference/types/schatmessage.md#channel)`get` | | string [**Message** ](/scripting/client-scripting-api-reference/types/schatmessage.md#message)`get` | #### Properties[​](#properties "Direct link to Properties") ##### SenderID[​](#senderid "Direct link to SenderID") uint **SenderID** `get` *ID of the sender of the message* * Lua ```lua function oc(chatm) Space.Log(chatm.SenderID) end Space.Network.Chat.OnChat(oc) ``` * Lua ```lua --this script processes every new chat message and makes a UIText display the Sender's ID uiText = Space.Host.GetReference("text").UIText --Add this Text object as reference in Scripting Runtime OnChatFunction = function(SChatMessage) uiText.Text = SChatMessage.SenderID end Space.Network.Chat.OnChat(OnChatFunction) ``` ##### Sender[​](#sender "Direct link to Sender") string **Sender** `get` *Name of the sender of the message* * Lua ```lua function oc(chatm) Space.Log(chatm.Sender) end Space.Network.Chat.OnChat(oc) ``` * Lua ```lua --this script processes every new chat message and makes a UIText display the Sender name uiText = Space.Host.GetReference("text").UIText --Add this Text object as reference in Scripting Runtime OnChatFunction = function(SChatMessage) uiText.Text = SChatMessage.Sender end Space.Network.Chat.OnChat(OnChatFunction) ``` ##### Channel[​](#channel "Direct link to Channel") string **Channel** `get` *Name of the channel* * Lua ```lua function oc(chatm) Space.Log(chatm.Channel) end Space.Network.Chat.OnChat(oc) ``` * Lua ```lua --this script processes every new chat message and makes a UIText display the channel's name uiText = Space.Host.GetReference("text").UIText --Add this Text object as reference in Scripting Runtime OnChatFunction = function(SChatMessage) uiText.Text = SChatMessage.Channel end Space.Network.Chat.OnChat(OnChatFunction) ``` ##### Message[​](#message "Direct link to Message") string **Message** `get` *The contents of the chat message* * Lua ```lua function oc(chatm) Space.Log(chatm.Message) end Space.Network.Chat.OnChat(oc) ``` * Lua ```lua --this script processes every new chat message and makes a UIText display the Message uiText = Space.Host.GetReference("text").UIText --Add this Text object as reference in Scripting Runtime OnChatFunction = function(SChatMessage) uiText.Text = SChatMessage.Message end Space.Network.Chat.OnChat(OnChatFunction) ``` --- ### SColor #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function | | --------------------------------------------------------------------------------------------------------------------------- | | string [**ToHex** ](/scripting/client-scripting-api-reference/types/scolor.md#tohex)() | | SColor [**Lerp** ](/scripting/client-scripting-api-reference/types/scolor.md#lerp)(SColor b, float t) | | bool [**Equals** ](/scripting/client-scripting-api-reference/types/scolor.md#equals)(SColor other) | | override string [**ToString** ](/scripting/client-scripting-api-reference/types/scolor.md#tostring)() | | static SColor [**New** ](/scripting/client-scripting-api-reference/types/scolor.md#new)(float r, float g, float b, float a) | | static SColor [**FromHex** ](/scripting/client-scripting-api-reference/types/scolor.md#fromhex)(string hex) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property | | ------------------------------------------------------------------------------------------- | | float [**R** ](/scripting/client-scripting-api-reference/types/scolor.md#r)`get` | | float [**G**](/scripting/client-scripting-api-reference/types/scolor.md#g) `get` | | float [**B**](/scripting/client-scripting-api-reference/types/scolor.md#b) `get` | | float [**A**](/scripting/client-scripting-api-reference/types/scolor.md#a) `get` | | SColor [**Black** ](/scripting/client-scripting-api-reference/types/scolor.md#black)`get` | | SColor [**White** ](/scripting/client-scripting-api-reference/types/scolor.md#white)`get` | | SColor [**Red** ](/scripting/client-scripting-api-reference/types/scolor.md#red)`get` | | SColor [**Blue** ](/scripting/client-scripting-api-reference/types/scolor.md#blue)`get` | | SColor [**Green** ](/scripting/client-scripting-api-reference/types/scolor.md#green)`get` | | SColor [**Yellow** ](/scripting/client-scripting-api-reference/types/scolor.md#yellow)`get` | #### Functions[​](#functions "Direct link to Functions") ##### ToHex[​](#tohex "Direct link to ToHex") string **ToHex** () *Return the Hex value of the color.* * Lua ```lua colorRedHex = Color.Red.ToHex() ``` ##### Lerp[​](#lerp "Direct link to Lerp") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **Lerp** ([SColor](/scripting/client-scripting-api-reference/types/scolor.md) b, float t) *Linearly interpolates between current color and b by t.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua lerpedRedBlue = Color.Blue.Lerp(Color.Red, 0.5) ``` * Lua ```lua --create a cube and set a new material. --add ScriptingRuntime. local mat=Space.Host.ExecutingObject.Renderer.Material function ChangeColor() mat.SetColor("_Color",Color.Red.Lerp(Color.Blue,Space.Math.PingPong(Space.Time,1))) end Space.Host.ExecutingObject.OnUpdate(ChangeColor) ``` ##### Equals[​](#equals "Direct link to Equals") bool **Equals** ([SColor](/scripting/client-scripting-api-reference/types/scolor.md) other) *Returns true if colors are same.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua isItTrue = Color.Red.Equals(Color.Blue) ``` ##### ToString[​](#tostring "Direct link to ToString") string **ToString** () *Returns the RGBA value of the current color.* * Lua ```lua redString = Color.Red.ToString() ``` ##### New[​](#new "Direct link to New") static [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **New** (float r, float g, float b, float a) *Create a color by red, green, blue and alpha parameters.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua theColor = Color.New(255.0, 0.0, 0.0, 1.0) ``` ##### FromHex[​](#fromhex "Direct link to FromHex") static [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **FromHex** (string hex) *Create a color by Hex value.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua fromHex = Color.FromHex('FF0000') ``` #### Properties[​](#properties "Direct link to Properties") ##### R[​](#r "Direct link to R") float **R** `get` *Property Description* * Lua ```lua r = Color.Red.R ``` ##### G[​](#g "Direct link to G") float **G** `get` *Property Description* * Lua ```lua g = Color.Red.G ``` ##### B[​](#b "Direct link to B") float **B** `get` *Property Description* * Lua ```lua g = Color.Red.B ``` ##### A[​](#a "Direct link to A") float **A** `get` *Property Description* * Lua ```lua g = Color.Red.A ``` ##### Black[​](#black "Direct link to Black") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **Black** `get` *Solid black. RGBA is (0, 0, 0, 1).* * Lua ```lua blackColor = Color.Black ``` ##### White[​](#white "Direct link to White") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **White** `get` *Solid White. RGBA is (1, 1, 1, 1).* * Lua ```lua whiteColor = Color.White ``` ##### Red[​](#red "Direct link to Red") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **Red** `get` *Solid Red. RGBA is (1, 0, 0, 1).* * Lua ```lua blackRed = Color.Red ``` ##### Blue[​](#blue "Direct link to Blue") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **Blue** `get` *Solid Blue. RGBA is (0, 0, 1, 1).* * Lua ```lua blueColor = Color.Blue ``` ##### Green[​](#green "Direct link to Green") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **Green** `get` *Solid Green. RGBA is (0, 1, 0, 1).* * Lua ```lua greenColor = Color.Green ``` ##### Yellow[​](#yellow "Direct link to Yellow") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **Yellow** `get` *Yellow. RGBA is (1, 0.92, 0.016, 1).* * Lua ```lua yellowColor = Color.Yellow ``` --- ### SCommandBuffer ##### DrawRenderer[​](#drawrenderer "Direct link to DrawRenderer") void **DrawRenderer** ([SRenderer](/scripting/client-scripting-api-reference/components/srenderer.md) renderer, [SMaterial](/scripting/client-scripting-api-reference/types/smaterial.md) material) *Add a "draw renderer" command.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua commandbuffer=Space.PostFX.CreateCommandBuffer() mat=Space.Resources[1] cube=Space.Host.GetReference("Cube") commandbuffer.DrawRenderer(cube.Renderer,mat.AsMaterial) Space.PostFX.AddCommandBufferToCamera(commandbuffer) ``` ##### Blit[​](#blit "Direct link to Blit") void **Blit** ([SMaterial](/scripting/client-scripting-api-reference/types/smaterial.md) mat) *Add a "bit into a render texture" command.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua commandbuffer=Space.PostFX.CreateCommandBuffer() mat=Space.Resources[1] commandbuffer.Blit(mat.AsMaterial) Space.PostFX.AddCommandBufferToCamera(commandbuffer) ``` --- ### SDateTime #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | --------------------------------------------------------------------------------------------------------------------------------------- | | bool [**Equals** ](/scripting/client-scripting-api-reference/types/sdatetime.md#equals)(SDateTime other) | | int [**ComparesTo** ](/scripting/client-scripting-api-reference/types/sdatetime.md#comparesto)(SDateTime other) | | string [**FormatLocal** ](/scripting/client-scripting-api-reference/types/sdatetime.md#formatlocal)(string format) | | string [**FormatGlobal** ](/scripting/client-scripting-api-reference/types/sdatetime.md#formatlocal)(string format) | | string [**Regional** ](/scripting/client-scripting-api-reference/types/sdatetime.md#regional)(string region) | | string [**FormatRegional** ](/scripting/client-scripting-api-reference/types/sdatetime.md#formatregional)(string region, string format) | | SDateTime [**AddYears** ](/scripting/client-scripting-api-reference/types/sdatetime.md#addyears)(int amount) | | SDateTime [**AddMonths** ](/scripting/client-scripting-api-reference/types/sdatetime.md#addmonths)(int amount) | | SDateTime [**AddDays** ](/scripting/client-scripting-api-reference/types/sdatetime.md#adddays)(double amount) | | SDateTime [**AddHours** ](/scripting/client-scripting-api-reference/types/sdatetime.md#addhours)(double amount) | | SDateTime [**AddMinutes** ](/scripting/client-scripting-api-reference/types/sdatetime.md#addminutes)(double amount) | | SDateTime [**AddSeconds** ](/scripting/client-scripting-api-reference/types/sdatetime.md#addseconds)(double amount) | | SDateTime [**AddMilliseconds** ](/scripting/client-scripting-api-reference/types/sdatetime.md#functionname-1)(double amount) | | | | | | **Static Functions** | | static SDateTime [**Now**](/scripting/client-scripting-api-reference/types/sdatetime.md#now)() | | static SDateTime [**Server** ](/scripting/client-scripting-api-reference/types/sdatetime.md#server)() | | static SDateTime [**Parse**](/scripting/client-scripting-api-reference/types/sdatetime.md#parse) (string input) | | static bool [**IsLeapYear**](/scripting/client-scripting-api-reference/types/sdatetime.md#isleapyear) (int year) | | static int [**DaysInMonth** ](/scripting/client-scripting-api-reference/types/sdatetime.md#daysinmonth)(int year, int month) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ------------------------------------------------------------------------------------------------------------------------ | | int [**Year** ](/scripting/client-scripting-api-reference/types/sdatetime.md#year)`get` | | int [**Month** ](/scripting/client-scripting-api-reference/types/sdatetime.md#month)`get` | | int [**Day** ](/scripting/client-scripting-api-reference/types/sdatetime.md#day)`get` | | int [**Hour** ](/scripting/client-scripting-api-reference/types/sdatetime.md#hour)`get` | | int [**Minute** ](/scripting/client-scripting-api-reference/types/sdatetime.md#minute)`get` | | int [**Second** ](/scripting/client-scripting-api-reference/types/sdatetime.md#second)`get` | | int [**Millisecond** ](/scripting/client-scripting-api-reference/types/sdatetime.md#millisecond)`get` | | string [**Local** ](/scripting/client-scripting-api-reference/types/sdatetime.md#local)`get` | | string [**Global** ](/scripting/client-scripting-api-reference/types/sdatetime.md#global)`get` | | int [**UnixTime** ](/scripting/client-scripting-api-reference/types/sdatetime.md#unixtime)`get` | | bool [**IsDaylightSavingTime** ](/scripting/client-scripting-api-reference/types/sdatetime.md#isdaylightsavingtime)`get` | #### Functions[​](#functions "Direct link to Functions") ##### Equals[​](#equals "Direct link to Equals") bool **Equals** (SDateTime other) *Returns true if the datetimes are same.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua \`\`\` ATargetDateTime = DateTime.Now().AddMinutes(5) AreEqual = ATargetDateTime.Equals(DateTime.Now()) \`\`\` ##### ComparesTo[​](#comparesto "Direct link to ComparesTo") int **ComparesTo** (SDateTime other) *Compares two datetimes and returns an integer. 0 == identical. greater than 0 == This datetime is greater than other. less than 0 == This datetime is less than other.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua ATargetDateTime = DateTime.Now().AddMinutes(5) AreEqual = ATargetDateTime.ComparesTo(DateTime.Now()) ``` ##### FormatLocal[​](#formatlocal "Direct link to FormatLocal") string **FormatLocal** (string format) *Outputs a custom formatted string with the date and time according to local language rules.* | Parameter | Type | Description | | --------- | ------ | ---------------------- | | format | string | See below for examples | * Lua ```lua localTimeCustomFormat = DateTime.Now().FormatLocal("dddd, MMMM dd, yyyy h:mm:ss tt") ``` * Lua \`\`\` --Example format strings \--\[\[ format = "dddd, MMMM dd, yyyy h:mm:ss tt" Result: Monday, May 28, 2012 11:35:00 AM format = "Ldddd, MMMM dd, yyyy" Result: Monday, May 28, 2012 format = "h:mm:ss tt" Result: 11:35:00 AM format = "MMMM dd" Result: May 28 format = "ddd, dd MMM yyyy HH':'mm':'ss 'GMT" Result: Mon, 28 May 2012 11:35:00 GMT format = "M/d/yyyy" Result: 5/28/2012 format = "h:mm tt" Result: 11:35 AM format = "yyyy'-'MM'-'dd'T'HH':'mm':'ss" Result: 2012-05-28T11:35:00 format = "yyyy'-'MM'-'dd HH':'mm':'ss'Z'" Result: 2012-05-28 11:35:00Z format = "MMMM, yyyy" Result: May, 2012 --]] \`\`\` ##### FunctionName[​](#functionname "Direct link to FunctionName") string **FormatGlobal** (string format) *Outputs a custom formatted string with the date and time according to global rules (culture invariant).* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua GlobalTimeCustomFormat = DateTime.Now().FormatLocal("dddd, MMMM dd, yyyy h:mm:ss tt") ``` * Lua ```lua --Example format strings --[[ format = "dddd, MMMM dd, yyyy h:mm:ss tt" Result: Monday, May 28, 2012 11:35:00 AM format = "Ldddd, MMMM dd, yyyy" Result: Monday, May 28, 2012 format = "h:mm:ss tt" Result: 11:35:00 AM format = "MMMM dd" Result: May 28 format = "ddd, dd MMM yyyy HH':'mm':'ss 'GMT" Result: Mon, 28 May 2012 11:35:00 GMT format = "M/d/yyyy" Result: 5/28/2012 format = "h:mm tt" Result: 11:35 AM format = "yyyy'-'MM'-'dd'T'HH':'mm':'ss" Result: 2012-05-28T11:35:00 format = "yyyy'-'MM'-'dd HH':'mm':'ss'Z'" Result: 2012-05-28 11:35:00Z format = "MMMM, yyyy" Result: May, 2012 --]] ``` ##### Regional[​](#regional "Direct link to Regional") string **Regional** (string region) *Outputs a string with the date and time formatted according to specific regional rules.* | Parameter | Type | Description | | --------- | ------ | --------------------------------------------------------------------------------------------------------------------------------- | | region | string | [List available here](https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-lcid/a9eac961-e77d-41a6-90a5-ce1a8b0cdb9c) | * Lua ```lua stringTimeRegional = DateTime.Now().Regional('en-us') ``` ##### FormatRegional[​](#formatregional "Direct link to FormatRegional") string **FormatRegional** (string region, string format) *Outputs a custom formatted string with the date and time according to specific regional rules.* | Parameter | Type | Description | | --------- | ------ | --------------------------------------------------------------------------------------------------------------------------------- | | region | string | [List available here](https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-lcid/a9eac961-e77d-41a6-90a5-ce1a8b0cdb9c) | | format | string | See below | * Lua ```lua stringTimeFormatRegional = DateTime.Now().FormatRegional('en-us','dddd, MMMM dd, yyyy h:mm:ss tt') ``` * Lua ```lua --Example format strings --[[ format = "dddd, MMMM dd, yyyy h:mm:ss tt" Result: Monday, May 28, 2012 11:35:00 AM format = "Ldddd, MMMM dd, yyyy" Result: Monday, May 28, 2012 format = "h:mm:ss tt" Result: 11:35:00 AM format = "MMMM dd" Result: May 28 format = "ddd, dd MMM yyyy HH':'mm':'ss 'GMT" Result: Mon, 28 May 2012 11:35:00 GMT format = "M/d/yyyy" Result: 5/28/2012 format = "h:mm tt" Result: 11:35 AM format = "yyyy'-'MM'-'dd'T'HH':'mm':'ss" Result: 2012-05-28T11:35:00 format = "yyyy'-'MM'-'dd HH':'mm':'ss'Z'" Result: 2012-05-28 11:35:00Z format = "MMMM, yyyy" Result: May, 2012 --]] ``` ##### AddYears[​](#addyears "Direct link to AddYears") SDateTime **AddYears** (int amount) *Return a new SDateTime that is the current date time + amount years.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua date5YearsLater = DateTime.Now().AddYears(5) ``` ##### AddMonths[​](#addmonths "Direct link to AddMonths") SDateTime **AddMonths** (int amount) *Return a new SDateTime that is the current date time + amount months.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua date5MonthsLater = DateTime.Now().AddMonths(5) ``` ##### AddDays[​](#adddays "Direct link to AddDays") SDateTime **AddDays** (double amount) *Return a new SDateTime that is the current date time + amount days.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua date5DaysLater = DateTime.Now().AddDays(5) ``` ##### AddHours[​](#addhours "Direct link to AddHours") SDateTime **AddHours** (double amount) *Return a new SDateTime that is the current date time + amount hours.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua date5HoursLater = DateTime.Now().AddHours(5) ``` ##### AddMinutes[​](#addminutes "Direct link to AddMinutes") SDateTime **AddMinutes** (double amount) *Return a new SDateTime that is the current date time + amount minutes.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua date5MinutesLater = DateTime.Now().AddMinutes(5) ``` ##### AddSeconds[​](#addseconds "Direct link to AddSeconds") SDateTime **AddSeconds** (double amount) *Return a new SDateTime that is the current date time + amount seconds.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua date5SecondsLater = DateTime.Now().AddSeconds(5) ``` ##### AddMilliseconds[​](#addmilliseconds "Direct link to AddMilliseconds") SDateTime **AddMilliseconds** (double amount) *Return a new SDateTime that is the current date time + amount milliseconds.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua date5MillisecondsLater = DateTime.Now().AddMilliseconds(5) ``` ##### Now[​](#now "Direct link to Now") static SDateTime **Now**() *Creates a new SDateTime object equal to the current local time.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua localDateTime = DateTime.Now() ``` ##### Server[​](#server "Direct link to Server") static SDateTime **Server** () *Creates a new SDateTime object equal to the current server time.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua serverDateTime = DateTime.Server() ``` ##### Parse[​](#parse "Direct link to Parse") static SDateTime **Parse** (string input) *Creates a new SDateTime object by attempting to parse a string input. Returns null/nil if the string cannot be parsed.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua parseDateTime = DateTime.Parse('10/3/2022 1:26:02 PM') ``` ##### IsLeapYear[​](#isleapyear "Direct link to IsLeapYear") static bool **IsLeapYear** (int year) *Return true if the specified year is a leap year.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua isLeapYear = DateTime.IsLeapYear(2024) ``` ##### DaysInMonth[​](#daysinmonth "Direct link to DaysInMonth") static int **DaysInMonth** (int year, int month) *Return the number of days in the given month for the given year.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua isLeapYear = DateTime.DaysInMonth(2022, 8) ``` #### Properties[​](#properties "Direct link to Properties") ##### Year[​](#year "Direct link to Year") int **Year** `get` *Get the independent time unit property of the SDateTime object.* * Lua ```lua currentYear = DateTime.Now().Year ``` ##### Month[​](#month "Direct link to Month") int **Month** `get` *Property Description* * Lua ```lua currentMonth = DateTime.Now().Month ``` ##### Day[​](#day "Direct link to Day") int **Day** `get` *Property Description* * Lua ```lua currentDay = DateTime.Now().Day ``` ##### Hour[​](#hour "Direct link to Hour") int **Hour** `get` *Property Description* * Lua ```lua currentHour = DateTime.Now().Hour ``` ##### Minute[​](#minute "Direct link to Minute") int **Minute** `get` *Property Description* * Lua ```lua currentMinute = DateTime.Now().Minute ``` ##### Second[​](#second "Direct link to Second") int **Second** `get` *Property Description* * Lua ```lua currentSecond = DateTime.Now().Second ``` ##### Millisecond[​](#millisecond "Direct link to Millisecond") int **Millisecond** `get` *Property Description* * Lua ```lua currentMillisecond = DateTime.Now().Millisecond ``` ##### Local[​](#local "Direct link to Local") string **Local** `get` *Outputs a string with the date and time formatted according to local language rules.* * Lua ```lua currentTimeStringLocal = DateTime.Now().Local ``` ##### Global[​](#global "Direct link to Global") string **Global** `get` *Outputs a string with the date and time formatted according to global rules (culture invariant).* * Lua ```lua currentTimeStringGlobal = DateTime.Now().Global ``` ##### UnixTime[​](#unixtime "Direct link to UnixTime") int **UnixTime** `get` *Return this time in Unix time, the number of seconds since Jan 1st, 1970.* * Lua ```lua currentUnixTime = DateTime.Now().UnixTime ``` ##### IsDaylightSavingTime[​](#isdaylightsavingtime "Direct link to IsDaylightSavingTime") bool **IsDaylightSavingTime** `get` *Indicates whether this instance of DateTime is within the daylight saving time range for the current time zone.* * Lua ```lua isCurrentTimeDaylightSaving = DateTime.Now().IsDaylightSavingTime ``` --- ### SGameObject #### Functions[​](#functions "Direct link to Functions") ##### SubscribeToEvents[​](#subscribetoevents "Direct link to SubscribeToEvents") void **SubscribeToEvents** () *Causes this script to start listening to events on the object.* info ***This function is now automatically called by events that require it*** * Lua ```lua Space.Host.ExecutingObject.SubscribeToEvents() ``` ##### SetSiblingIndex[​](#setsiblingindex "Direct link to SetSiblingIndex") void **SetSiblingIndex** (int newIndex) *Sets the sibling index.* *Use this to change the sibling index of the GameObject. If a GameObject shares a parent with other GameObjects and are on the same level (i.e. they share the same direct parent), these GameObjects are known as siblings. The sibling index shows where each GameObject sits in this sibling hierarchy.* *Use SetSiblingIndex to change the GameObject’s place in this hierarchy. When the sibling index of a GameObject is changed, its order in the Hierarchy window will also change.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.SetSiblingIndex(2) ``` ##### SetAsFirstSibling[​](#setasfirstsibling "Direct link to SetAsFirstSibling") void **SetAsFirstSibling** () *This GameObject becomes the first Sibling* * Lua ```lua Space.Host.ExecutingObject.SetAsFirstSibling() ``` ##### SetAsLastSibling[​](#setaslastsibling "Direct link to SetAsLastSibling") void **SetAsLastSibling** () *This GameObject becomes the last Sibling* * Lua ```lua Space.Host.ExecutingObject.SetAsLastSibling() ``` ##### Duplicate[​](#duplicate "Direct link to Duplicate") SGameObject **Duplicate** () *Copies the object and returns a reference to the copy. Equivalent to calling Instantiate() in Unity* * Lua ```lua local copy = Space.Host.ExecutingObject.Duplicate() ``` * Lua ```lua --this script will make this object, once clicked, duplicate itself, then the duplicate --moves up and then duplicate itself again and the duplicate move down (total 3 vertically aligned) --(Example: cells multiplying) thisGameObject = Space.Host.ExecutingObject OnClick = function() local firstDuplicate = thisGameObject.Duplicate() firstDuplicate.WorldPosition = firstDuplicate.WorldPosition + firstDuplicate.Up local secondDuplicate = thisGameObject.Duplicate() secondDuplicate.WorldPosition = secondDuplicate.WorldPosition - secondDuplicate.Up end thisGameObject.AddClickable() thisGameObject.Clickable.Tooltip="Click to watch me multiply " thisGameObject.Clickable.OnClick(OnClick) ``` ##### Instantiate[​](#instantiate "Direct link to Instantiate") SGameObject **Instantiate** () *Copy of Duplicate() for convenience* * Lua ```lua NewGameObject = Space.Host.ExecutingObject.Instantiate() ``` * Lua ```lua --this script will make this object, once clicked, duplicate itself, then the duplicate --moves up and then duplicate itself again and the duplicate move down (total 3 vertically aligned) --(Example: cells multiplying) thisGameObject = Space.Host.ExecutingObject OnClick = function() local firstDuplicate = thisGameObject.Instantiate() firstDuplicate.WorldPosition = firstDuplicate.WorldPosition + firstDuplicate.Up local secondDuplicate = thisGameObject.Instantiate() secondDuplicate.WorldPosition = secondDuplicate.WorldPosition - secondDuplicate.Up end thisGameObject.AddClickable() thisGameObject.Clickable.Tooltip="Click to watch me multiply " thisGameObject.Clickable.OnClick(OnClick) ``` ##### AddHingeJoint[​](#addhingejoint "Direct link to AddHingeJoint") [SHingeJoint](/scripting/client-scripting-api-reference/components/shingejoint.md) **AddHingeJoint** () *Adds a Hinge Joint component to this Game Object and returns its reference* * Lua ```lua NewHingeJoint = Space.Host.ExecutingObject.AddHingeJoint() ``` * Lua ```lua --clicking this object will add a Hinge Joint component to it at runtime thisObject = Space.Host.ExecutingObject OnClick = function() HJ = thisObject.AddHingeJoint() end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### AddLight[​](#addlight "Direct link to AddLight") [SLight](/scripting/client-scripting-api-reference/components/slight.md) **AddLight** () *Adds a Light component to the object.* * Lua ```lua newLightComponent = Space.Host.ExecutingObject.AddLight() ``` ##### AddAnimator[​](#addanimator "Direct link to AddAnimator") [SAnimator](/scripting/client-scripting-api-reference/components/sanimator.md) **AddAnimator** () *Adds an Animator component to this Game Object and returns its reference* * Lua ```lua NewAnimator = Space.Host.ExecutingObject.AddAnimator() ``` * Lua ```lua --clicking this object will add an animator to it and controller at runtime thisObject = Space.Host.ExecutingObject theResource = Space.GetResource("An Animator Controller") -- add controller to resources in Scripting Runtime OnClick = function() Animator = thisObject.AddAnimator() Animator.Controller = theResource end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### AddAudioSource[​](#addaudiosource "Direct link to AddAudioSource") [SAudioSource](/scripting/client-scripting-api-reference/components/saudiosource.md) **AddAudioSource** () *Adds an AudioSource component to the object.* * Lua ```lua newAudioSourceComponent = Space.Host.ExecutingObject.AddAudioSource() ``` ##### AddClickable[​](#addclickable "Direct link to AddClickable") [SClickable](/scripting/client-scripting-api-reference/components/sclickable.md) **AddClickable** () *Adds a Clickable component to the object.* * Lua ```lua newClikcableComponent = Space.Host.ExecutingObject.AddClickable() ``` ##### GetScript[​](#getscript "Direct link to GetScript") [SScriptingRuntime](/scripting/client-scripting-api-reference/components/sscriptingruntime.md) **GetScript** (string name) *Returns a Scripting Runtime component attached to this object by Component Name, or nil if none exist* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua scriptingRuntime = Space.Host.ExecutingObject.GetScript("scriptingruntimecomponentname") ``` ##### GetScriptsInChildren[​](#getscriptsinchildren "Direct link to GetScriptsInChildren") List< [SScriptingRuntime](/scripting/client-scripting-api-reference/components/sscriptingruntime.md) > **GetScriptsInChildren** (string name, bool includeInactive=false) *Returns Scripting Runtime components attached to this object by Component Name or its children* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua tableScriptsInChildren = Space.Host.ExecutingObject.GetScriptsInChildren("scriptingruntimecomponentname",true) ``` ##### GetScriptInChildren[​](#getscriptinchildren "Direct link to GetScriptInChildren") [SScriptingRuntime](/scripting/client-scripting-api-reference/components/sscriptingruntime.md) **GetScriptInChildren** (string name, bool includeInactive=false) *Returns a Scripting Runtime component attached to this object or its children by Component Name, or nil if none exist* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua scriptingRuntimeInChildren = Space.Host.ExecutingObject.GetScriptInChildren("scriptingruntimecomponentname",true) ``` ##### GetScriptInParent[​](#getscriptinparent "Direct link to GetScriptInParent") [SScriptingRuntime](/scripting/client-scripting-api-reference/components/sscriptingruntime.md) **GetScriptInParent** (string name) *Returns a Scripting Runtime component attached to this object or its parents by Component Name, or nil if none exist* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua scriptingRuntimeInParent = Space.Host.ExecutingObject.GetScript("scriptingruntimecomponentname") ``` ##### GetEvents[​](#getevents "Direct link to GetEvents") [SScriptingEvents](/scripting/client-scripting-api-reference/components/sscriptingevents.md) **GetEvents** (string name) *Function Description* | Parameter | Type | Description | | --------- | ------ | ----------- | | name | string | | * Lua ```lua scriptingEvent = Space.Host.ExecutingObject.GetEvents('ScriptingEventsComponentName') ``` ##### GetAllEventsInChildren[​](#getalleventsinchildren "Direct link to GetAllEventsInChildren") List< [SScriptingEvents](/scripting/client-scripting-api-reference/components/sscriptingevents.md) > **GetAllEventsInChildren** (string name, bool includeInactive=false) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua tableScriptingEvent = Space.Host.ExecutingObject.GetAllEventsInChildren ``` ##### GetEventsInChildren[​](#geteventsinchildren "Direct link to GetEventsInChildren") [SScriptingEvents](/scripting/client-scripting-api-reference/components/sscriptingevents.md) **GetEventsInChildren** (string name, bool includeInactive=false) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua scriptingEvent = Space.Host.ExecutingObject.GetEventsInChildren('ScriptingEventsComponentName') --or scriptingEvent = Space.Host.ExecutingObject.GetEventsInChildren('ScriptingEventsComponentName', true) ``` ##### GetEventsInParent[​](#geteventsinparent "Direct link to GetEventsInParent") [SScriptingEvents](/scripting/client-scripting-api-reference/components/sscriptingevents.md) **GetEventsInParent** (string name) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua scriptingEvent = Space.Host.ExecutingObject.GetEventsInParent('ScriptingEventsComponentName') ``` ##### GetResources[​](#getresources "Direct link to GetResources") [SScriptingResources](/scripting/client-scripting-api-reference/components/sscriptingresources.md) **GetResources** (string name) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.GetResources('ResourcesComponentName') ``` ##### GetAllResourcesInChildren[​](#getallresourcesinchildren "Direct link to GetAllResourcesInChildren") List< [SScriptingResources](/scripting/client-scripting-api-reference/components/sscriptingresources.md) > **GetAllResourcesInChildren** (string name, bool includeInactive=false) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua tableScriptingResources = Space.Host.ExecutingObject.GetAllResourcesInChildren('ScriptingResourcesComponentName') --or tableScriptingResources = Space.Host.ExecutingObject.GetAllResourcesInChildren('ScriptingResourcesComponentName', true) ``` ##### GetResourcesInChildren[​](#getresourcesinchildren "Direct link to GetResourcesInChildren") [SScriptingResources](/scripting/client-scripting-api-reference/components/sscriptingresources.md) **GetResourcesInChildren** (string name, bool includeInactive=false) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua tableScriptingResources = Space.Host.ExecutingObject.GetResourcesInChildren('ScriptingResourcesComponentName') --or tableScriptingResources = Space.Host.ExecutingObject.GetResourcesInChildren('ScriptingResourcesComponentName', true) ``` ##### GetResourcesInParent[​](#getresourcesinparent "Direct link to GetResourcesInParent") [SScriptingResources](/scripting/client-scripting-api-reference/components/sscriptingresources.md) **GetResourcesInParent** (string name) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua tableScriptingResources = Space.Host.ExecutingObject.GetResourcesInParent('ScriptingResourcesComponentName') ``` ##### GetData[​](#getdata "Direct link to GetData") [SScriptingData](/scripting/client-scripting-api-reference/components/sscriptingdata.md) **GetData** (string name) *Returns a Scripting Data component attached to this object by Component Name, or nil if none exist* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua scriptingData = Space.Host.ExecutingObject.GetData("scriptingdatacomponentname") ``` ##### GetAllDataInChildren[​](#getalldatainchildren "Direct link to GetAllDataInChildren") List< [SScriptingData](/scripting/client-scripting-api-reference/components/sscriptingdata.md) > **GetAllDataInChildren** (string name, bool includeInactive=false) *Returns Scripting Data components attached to this object by Component Name or its children* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua tableScriptingDataInChildren = Space.Host.ExecutingObject.GetAllDataInChildren("scriptingdatacomponentname",true) ``` ##### GetDataInChildren[​](#getdatainchildren "Direct link to GetDataInChildren") [SScriptingData](/scripting/client-scripting-api-reference/components/sscriptingdata.md) **GetDataInChildren** (string name, bool includeInactive=false) *Returns a Scripting Data component attached to this object or its children by Component Name, or nil if none exist* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua scriptingDataInChildren = Space.Host.ExecutingObject.GetDataInChildren("scriptingdatacomponentname",true) ``` ##### GetDataInParent[​](#getdatainparent "Direct link to GetDataInParent") [SScriptingData](/scripting/client-scripting-api-reference/components/sscriptingdata.md) **GetDataInParent** (string name) *Returns a Scripting Data component attached to this object or its parents by Component Name, or nil if none exist* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua scriptingDataInParent = Space.Host.ExecutingObject.GetDataInParent("scriptingdatacomponentname") ``` ##### AddRigidbody[​](#addrigidbody "Direct link to AddRigidbody") [SRigidbody](/scripting/client-scripting-api-reference/components/srigidbody.md) **AddRigidbody** () *Adds a Rigidbody component to the object.* * Lua ```lua newRigibodyComponent = Space.Host.ExecutingObject.AddRigidbody() ``` ##### AddNavMeshAgent[​](#addnavmeshagent "Direct link to AddNavMeshAgent") [SNavMeshAgent](/scripting/client-scripting-api-reference/components/snavmeshagent.md) **AddNavMeshAgent** () *Adds a NavMeshAgent component to the object.* * Lua ```lua newNavMeshAgentComponent = Space.Host.ExecutingObject.AddNavMeshAgent() ``` ##### AddSeat[​](#addseat "Direct link to AddSeat") [SSeat](/scripting/client-scripting-api-reference/components/sseat.md) **AddSeat** () *Adds a Seat component to the object.* * Lua ```lua newSeatComponent = Space.Host.ExecutingObject.AddSeat() ``` ##### OnAwake[​](#onawake "Direct link to OnAwake") void **OnAwake** (Closure e) *Binds a event to the Awake() event.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua function F() Space.Log("bound") end Space.Host.ExecutingObject.OnAwake(F) ``` ##### OnStart[​](#onstart "Direct link to OnStart") void **OnStart** (Closure e) *Binds a event to the Start() event.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua function F() Space.Log("bound") end Space.Host.ExecutingObject.OnStart(F) ``` ##### OnEnable[​](#onenable "Direct link to OnEnable") void **OnEnable** (Closure e) *Binds a event to the OnEnable() event.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua function F() Space.Log("bound") end Space.Host.ExecutingObject.OnEnable(F) ``` ##### OnDisable[​](#ondisable "Direct link to OnDisable") void **OnDisable** (Closure e) *Binds a event to the OnDisable() event.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua function F() Space.Log("bound") end Space.Host.ExecutingObject.OnDisable(F) ``` ##### OnFixedUpdate[​](#onfixedupdate "Direct link to OnFixedUpdate") void **OnFixedUpdate** (Closure e) *Binds a event to the OnFixedUpdate() event.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua function F() Space.Log("bound") end Space.Host.ExecutingObject.OnFixedUpdate(F) ``` * Lua ```lua --this script will make this object move forward each physics frame thisObject = Space.Host.ExecutingObject OnFixedUpdate = function() thisObject.WorldPosition = thisObject.WorldPosition + (thisObject.Forward * 0.01 ) --unlike OnUpdate we did not multiply by Space.DeltaTime --because OnFixedUpdate executes at the same rate regardless end thisObject.OnFixedUpdate(OnFixedUpdate) ``` ##### OnLateUpdate[​](#onlateupdate "Direct link to OnLateUpdate") void **OnLateUpdate** (Closure e) *Binds a event to the OnLateUpdate() event.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua function F() Space.Log("bound") end Space.Host.ExecutingObject.OnLateUpdate(F) ``` * Lua ```lua --this script will make this object move forward each frame --but it will be last to move among other objects (read about OnLateUpdate) --(example: camera movement) thisObject = Space.Host.ExecutingObject OnLateUpdate = function() thisObject.WorldPosition = thisObject.WorldPosition + (thisObject.Forward * 0.01 * Space.DeltaTime) --we multipy by Space.DeltaTime so that it behaves the same for all players --even though they have different FPS (frames per second) end thisObject.OnLateUpdate(OnLateUpdate) ``` ##### OnTriggerStart[​](#ontriggerstart "Direct link to OnTriggerStart") void **OnTriggerStart** (Action< SGameObject > e)
void **OnTriggerStart** (Closure e) *When a GameObject collides with another GameObject, Unity calls OnTriggerEnter.* *OnTriggerEnter happens on the FixedUpdate function when two GameObjects collide. The Colliders involved are not always at the point of initial contact.* *Note: Both GameObjects must contain a Collider component. One must have Collider.isTrigger enabled, and contain a Rigidbody. If both GameObjects have Collider.isTrigger enabled, no collision happens. The same applies when both GameObjects do not have a Rigidbody component.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua this = Space.Host.ExecutingObject OnTriggerStart = function(SGameObject) Space.Log("Trigger Start") end this.OnTriggerStart (OnTriggerStart ) ``` * Lua ```lua --the below scipt makes this object a boundary area where flying gets blocked --while player is in it and flying is allowed once player leaves it --(Example: No fly zone) --[This object's collider needs to be set as IsTrigger (Please read about OnTriggerStart for troubleshooting)] thisGameObject = Space.Host.ExecutingObject OnTriggerStart = function(TriggerStarter) if TriggerStarter.Root.Avatar ~= nil then if TriggerStarter.Root.Avatar.Username == Space.Scene.PlayerAvatar.Username then Space.Scene.PlayerAvatar.BlockFly = true end end end OnTriggerExit = function(TriggerExiter) if TriggerExiter.Root.Avatar ~= nil then if TriggerExiter.Root.Avatar.Username == Space.Scene.PlayerAvatar.Username then Space.Scene.PlayerAvatar.BlockFly = false end end end thisGameObject.OnTriggerStart(OnTriggerStart) thisGameObject.OnTriggerExit(OnTriggerExit) ``` ##### OnTriggerStay[​](#ontriggerstay "Direct link to OnTriggerStay") void **OnTriggerStay** (Action< SGameObject > e)
void **OnTriggerStay** (Closure e) *OnTriggerStay is called almost all the frames for every Collider other that is touching the trigger. The function is on the physics timer so it won't necessarily run every frame.* *This message is sent to the trigger and the collider that touches the trigger. Note that trigger events are only sent if one of the colliders also has a rigidbody attached. Trigger events will be sent to disabled MonoBehaviours, to allow enabling Behaviours in response to collisions.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua this = Space.Host.ExecutingObject OnTriggerStay = function(SGameObject) Space.Log("Trigger Stay") end this.OnTriggerStay(OnTriggerStay) ``` * Lua ```lua --the below scipt makes this object a boundary area where any user entering it --will be blocked from movement for 10 seconds, then the object will release controls and --destry itself after that --(Example: freezing trap) --[This object's collider needs to be set as IsTrigger (Please read about OnTriggerStart for troubleshooting)] thisGameObject = Space.Host.ExecutingObject FrozenTime = 0.0 OnTriggerStart = function(TriggerStarter) if TriggerStarter.Root.Avatar ~= nil then if TriggerStarter.Root.Avatar.Username == Space.Scene.PlayerAvatar.Username then Space.Scene.PlayerAvatar.BlockMovement = true end end end OnTriggerStay = function(TriggerStayer) if TriggerStayer.Root.Avatar ~= nil then if TriggerStayer.Root.Avatar.Username == Space.Scene.PlayerAvatar.Username then FrozenTime = FrozenTime + Space.DeltaTime if FrozenTime > 20 then Space.Scene.PlayerAvatar.BlockMovement = false thisGameObject.Destroy() end end end end thisGameObject.OnTriggerStart(OnTriggerStart) thisGameObject.OnTriggerStay(OnTriggerStay) ``` ##### OnTriggerExit[​](#ontriggerexit "Direct link to OnTriggerExit") void **OnTriggerExit** (Action< SGameObject > e)
void **OnTriggerExit** (Closure e) *OnTriggerExit is called when the Collider other has stopped touching the trigger.* *This message is sent to the trigger and the Collider that touches the trigger. Notes: Trigger events are only sent if one of the Colliders also has a Rigidbody attached. Trigger events will be sent to disabled MonoBehaviours, to allow enabling Behaviours in response to collisions. OnTriggerExit occurs on the FixedUpdate after the Colliders have stopped touching. The Colliders involved are not guaranteed to be at the point of initial separation.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua this = Space.Host.ExecutingObject OnTriggerExit = function(SGameObject) Space.Log("Trigger Stay") end this.OnTriggerExit(OnTriggerExit) ``` * Lua ```lua --the below scipt makes this object a boundary area where flying gets blocked --while player is in it and flying is allowed once player leaves it --(Example: No fly zone) --[This object's collider needs to be set as IsTrigger (Please read about OnTriggerStart for troubleshooting)] thisGameObject = Space.Host.ExecutingObject OnTriggerStart = function(TriggerStarter) if TriggerStarter.Root.Avatar ~= nil then if TriggerStarter.Root.Avatar.Username == Space.Scene.PlayerAvatar.Username then Space.Scene.PlayerAvatar.BlockFly = true end end end OnTriggerExit = function(TriggerExiter) if TriggerExiter.Root.Avatar ~= nil then if TriggerExiter.Root.Avatar.Username == Space.Scene.PlayerAvatar.Username then Space.Scene.PlayerAvatar.BlockFly = false end end end thisGameObject.OnTriggerStart(OnTriggerStart) thisGameObject.OnTriggerExit(OnTriggerExit) ``` ##### OnCollisionEnter[​](#oncollisionenter "Direct link to OnCollisionEnter") void **OnCollisionEnter** (Action< SPhysicsHit > e)
void **OnCollisionEnter** (Closure e) *OnCollisionEnter is called when this collider/rigidbody has begun touching another rigidbody/collider.* *In contrast to* [*OnTrigger*](/scripting/client-scripting-api-reference/types/sgameobject.md#ontriggerstart)[*Start*](/scripting/client-scripting-api-reference/types/sgameobject.md#ontriggerstart)*, OnCollisionEnter is passed the* [*SPhysicsHit*](/scripting/client-scripting-api-reference/types/sphysicshit.md) *class and not a Collider (GameObject). The SPhysicsHit class contains information, for example, about contact points and impact velocity. Notes: Collision events are only sent if one of the colliders also has a non-kinematic rigidbody attached. Collision events will be sent to disabled MonoBehaviours, to allow enabling Behaviours in response to collisions.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua this = Space.Host.ExecutingObject OnCollisionEnter = function(SPhysicsHit) Space.Log("Collision Enter") end this.OnCollisionEnter(OnCollisionEnter) ``` * Lua ```lua --this script will make this object delete itself if it collides with something --(Example: grenade) --[Make sure you add a rigibody to this object (read above about "collisions") thisGameObject = Space.Host.ExecutingObject OnCollisionEnter = function(SPhysicsHit) thisGameObject.Destroy() end thisGameObject.OnCollisionEnter(OnCollisionEnter) ``` ##### OnCollisionStay[​](#oncollisionstay "Direct link to OnCollisionStay") void **OnCollisionStay** (Action< [SPhysicsHit](/scripting/client-scripting-api-reference/types/sphysicshit.md) > e)
void **OnCollisionStay** (Closure e) *OnCollisionStay is called once per frame for every collider/rigidbody that is touching rigidbody/collider.* *In contrast to* [*OnTriggerStay*](/scripting/client-scripting-api-reference/types/sgameobject.md#ontriggerstay)*, OnCollisionStay is passed the* [*SPhysicsHit*](/scripting/client-scripting-api-reference/types/sphysicshit.md) *class and not a Collider (GameObject). The* [*SPhysicsHit*](/scripting/client-scripting-api-reference/types/sphysicshit.md) *class contains information about contact points, impact velocity etc. If you don't use collisionInfo in the function, leave out the collisionInfo parameter as this avoids unneccessary calculations. Notes: Collision events are only sent if one of the colliders also has a non-kinematic rigidbody attached. Collision events will be sent to disabled MonoBehaviours, to allow enabling Behaviours in response to collisions. Collision stay events are not sent for sleeping Rigidbodies.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua this = Space.Host.ExecutingObject OnCollisionStay = function(SPhysicsHit) Space.Log("Collision Stay") end this.OnCollisionStay(OnCollisionStay) ``` * Lua ```lua --this script will make this object delete itself if --it is being touched for around 10 seconds --(Example: a flag being captured) --[Make sure this object has collider/rigidbody (read above about "collisions" for troubleshooting)] thisGameObject = Space.Host.ExecutingObject touchedTime = 0.0 OnCollisionStay = function(SPhysicsHit) touchedTime = touchedTime + Space.DeltaTime if touchedTime > 25 then thisGameObject.Destroy() end end thisGameObject.OnCollisionStay(OnCollisionStay) ``` ##### OnCollisionExit[​](#oncollisionexit "Direct link to OnCollisionExit") void **OnCollisionExit** (Action< [SPhysicsHit](/scripting/client-scripting-api-reference/types/sphysicshit.md) > e)
void **OnCollisionExit** (Closure e) *OnCollisionExit is called when this collider/rigidbody has stopped touching another rigidbody/collider.* *In contrast to OnTriggerExit, OnCollisionExit is passed the SPhysicsHit class and not a Collider. The SPhysicsHit class contains information about contact points, impact velocity etc. If you don't use collisionInfo in the function, leave out the collisionInfo parameter as this avoids unneccessary calculations. Notes: Collision events are only sent if one of the colliders also has a non-kinematic rigidbody attached. Collision events will be sent to disabled MonoBehaviours, to allow enabling Behaviours in response to collisions.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua this = Space.Host.ExecutingObject OnCollisionExit = function(SPhysicsHit) Space.Log("Collision Exit") end this.OnCollisionExit(OnCollisionExit) ``` * Lua ```lua --this script will make this object destroy itself when an object --that collided with it exits the collission --(Example: landmine) --[Make sure you add a rigibody to this object (read above about "collisions") thisGameObject = Space.Host.ExecutingObject OnCollisionExit = function(SPhysicsHit) thisGameObject.Destroy() end thisGameObject.OnCollisionExit(OnCollisionExit) ``` ##### OnParticleCollision[​](#onparticlecollision "Direct link to OnParticleCollision") void **OnParticleCollision** (Action< SGameObject > e)
void **OnParticleCollision** (Closure e) *OnParticleCollision is called when a particle hits a Collider.* *This can be used to apply damage to a GameObject when hit by particles.* *This message is sent to scripts attached to Particle Systems and to the Collider that was hit.* *When OnParticleCollision is invoked from a script attached to a GameObject with a Collider, the GameObject parameter represents the ParticleSystem. The Collider receives at most one message per Particle System that collided with it in any given frame even when the Particle System struck the Collider with multiple particles in the current frame.* *When OnParticleCollision is invoked from a script attached to a ParticleSystem, the GameObject parameter represents a GameObject with an attached Collider struck by the ParticleSystem. The ParticleSystem receives at most one message per Collider that is struck.* *Messages are only sent if you enable Send Collision Messages in the Inspector of the Particle System Collision module.* *The OnParticleCollision can be a co-routine. Simply use the yield statement in the function.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua this = Space.Host.ExecutingObject OnParticleCollision = function(GameObject) Space.Log("Particle Collision") end this.OnParticleCollision(OnParticleCollision) ``` ##### OnParticleTrigger[​](#onparticletrigger "Direct link to OnParticleTrigger") void **OnParticleTrigger** (Closure e) *Binds a new event handler for the OnParticleTrigger event.* *OnParticleTrigger event is called when any particles in a Particle System meet the conditions in the trigger module.* *This can be used to kill or modify particles that are inside or outside a collision volume.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua this = Space.Host.ExecutingObject OnParticleTrigger = function(GameObject) Space.Log("Particle Trigger Event") end this.OnParticleTrigger(OnParticleTrigger) ``` ##### OnUpdate[​](#onupdate "Direct link to OnUpdate") void **OnUpdate** (Closure e) *Binds a event to the OnUpdate() event.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua function F() Space.Log("bound") end Space.Host.ExecutingObject.OnUpdate(F) ``` * Lua ```lua --this script will make this object move forward each frame thisObject = Space.Host.ExecutingObject OnUpdate = function() thisObject.WorldPosition = thisObject.WorldPosition + (thisObject.Forward * 0.01 * Space.DeltaTime) --we multipy by Space.DeltaTime so that it behaves the same for all players --even though they have different FPS (frames per second) end thisObject.OnUpdate(OnUpdate) ``` ##### OnMouseDown[​](#onmousedown "Direct link to OnMouseDown") void **OnMouseDown** (Closure e) *Binds a event to the OnMouseDown() event.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua function F() Space.Log("bound") end Space.Host.ExecutingObject.OnMouseDown(F) ``` ##### OnApplicationQuit[​](#onapplicationquit "Direct link to OnApplicationQuit") void **OnApplicationQuit** (Closure e) *Binds a new event handler for the On Application Quit event* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua this = Space.Host.ExecutingObject OnApplicationQuit = function() Space.Log("Application Quit") end this.OnApplicationQuit(OnApplicationQuit) ``` ##### CompareTag[​](#comparetag "Direct link to CompareTag") bool **CompareTag** (string tag) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua isSame = Space.Host.ExecutingObject.CompareTag('tagname') ``` ##### SetParent[​](#setparent "Direct link to SetParent") void **SetParent** (SGameObject other, bool worldPositionStays=true) *Make this GameObject the child of GameObject 'other'* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.SetParent(otherObjectReference,true) ``` * Lua ```lua --this script will set your avatar's "right hand" as parent of this object --this way this object will be a child of your right hand and therefore move with it --(Example: clicking on a gun to equip it) thisGameObject = Space.Host.ExecutingObject OnClick = function() RightHand = Space.Scene.PlayerAvatar.FindBone("RightHand") thisGameObject.SetParent(RightHand) thisGameObject.LocalPosition = Vector.New(0,0,0) -- resetting position to match hand end thisGameObject.AddClickable() thisGameObject.Clickable.Tooltip="Click to Equip " thisGameObject.Clickable.OnClick(OnClick) ``` ##### Find[​](#find "Direct link to Find") SGameObject **Find** (string name) *Find and return a reference to GameObject with name 'name'* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua FoundObject = Space.Host.ExecutingObject.Find("GameObject Name") ``` ##### FindInChildren[​](#findinchildren "Direct link to FindInChildren") SGameObject **FindInChildren** (string name) *Find and return a reference to GameObject with name 'name' including children* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua FoundObjectInChildren = Space.Host.ExecutingObject.FindInChildren("GameObject Name") ``` ##### Destroy[​](#destroy "Direct link to Destroy") void **Destroy** () *Schedules this object for deletion at the end of the frame* * Lua ```lua Space.Host.ExecutingObject.Destroy() ``` ##### GetComponent[​](#getcomponent "Direct link to GetComponent") SComponent **GetComponent** (string name) danger Depreciated #### Properties[​](#properties "Direct link to Properties") ##### Owner[​](#owner "Direct link to Owner") long **Owner** `get` *Returns the GameObject's Owner* * Lua ```lua Owner = Space.Host.ExecutingObject.Owner ``` ##### LocalID[​](#localid "Direct link to LocalID") int **LocalID** `get` *Returns the GameObject's Local ID* * Lua ```lua LocalID = Space.Host.ExecutingObject.LocalID ``` ##### InventoryID[​](#inventoryid "Direct link to InventoryID") int **InventoryID** `get` *Return's the GameObject's InventoryID* * Lua ```lua InventoryID = Space.Host.ExecutingObject.InventoryID ``` ##### HasStableID[​](#hasstableid "Direct link to HasStableID") bool **HasStableID** `get` *Returns true if GameObject has Stable ID* * Lua ```lua HasStableID = Space.Host.ExecutingObject.HasStableID ``` ##### GlobalID[​](#globalid "Direct link to GlobalID") string? **GlobalID** `get` *Returns the global ID of the GameObject* * Lua ```lua GlobalID = Space.Host.ExecutingObject.GlobalID ``` ##### Exists[​](#exists "Direct link to Exists") bool **Exists** `get` *Does this object still exist in the scene (returns false if the object has been deleted via Destroy();)* * Lua ```lua doesExist = Space.Host.ExecutingObject.Exists ``` ##### HingeJoint[​](#hingejoint "Direct link to HingeJoint") [SHingeJoint](/scripting/client-scripting-api-reference/components/shingejoint.md) **HingeJoint** `get` *Returns a HingeJoint component attached to this object, or nil if none exist* * Lua ```lua HingeJoint = Space.Host.ExecutingObject.HingeJoint ``` ##### Light[​](#light "Direct link to Light") [SLight](/scripting/client-scripting-api-reference/components/slight.md) **Light** `get` *Returns a reference to a Light component on the object. Will return null if it does not exist.* * Lua ```lua newLightComponent = Space.Host.ExecutingObject.Light ``` ##### ReflectionProbe[​](#reflectionprobe "Direct link to ReflectionProbe") [SReflectionProbe](/scripting/client-scripting-api-reference/components/sreflectionprobe.md) **ReflectionProbe** `get` *Returns a ReflectionProbe component attached to this object, or nil if none exist* * Lua ```lua ReflectionProbe = Space.Host.ExecutingObject.ReflectionProbe ``` ##### LightInChild[​](#lightinchild "Direct link to LightInChild") [SLight](/scripting/client-scripting-api-reference/components/slight.md) **LightInChild**`get` *Returns a Light component attached to this object or its children, or nil if none exist* * Lua ```lua LightInChild = Space.Host.ExecutingObject.LightInChild ``` ##### LightInParent[​](#lightinparent "Direct link to LightInParent") [SLight](/scripting/client-scripting-api-reference/components/slight.md) **LightInParent** `get` *Returns a Light component attached to this object or it's parent, or nil if none exist* * Lua ```lua LightInParent = Space.Host.ExecutingObject.LightInParent ``` ##### Animator[​](#animator "Direct link to Animator") [SAnimator](/scripting/client-scripting-api-reference/components/sanimator.md) **Animator** `get` *Returns a reference to a Animator component on the object. Will return null if it does not exist.* * Lua ```lua animatorComponent = Space.Host.ExecutingObject.Animator ``` ##### Animation[​](#animation "Direct link to Animation") [SAnimation](/scripting/client-scripting-api-reference/components/sanimation.md) **Animation** `get` *Returns an Animation component attached to this object, or nil if none exist Animation is a legacy component and should not be confused with Animator* * Lua ```lua Animation = Space.Host.ExecutingObject.Animation ``` ##### CanvasGroup[​](#canvasgroup "Direct link to CanvasGroup") [SCanvasGroup](/scripting/client-scripting-api-reference/components/scanvasgroup.md) **CanvasGroup** `get` *Returns Canvas Group component attached to this object, or nil if none exist* * Lua ```lua CanvasGroup = Space.Host.ExecutingObject.CanvasGroup ``` ##### Audio[​](#audio "Direct link to Audio") [SAudioSource](/scripting/client-scripting-api-reference/components/saudiosource.md) **Audio** `get` *Returns a reference to a AudioSource component on the object. Will return null if it does not exist.* * Lua ```lua newAudioComponent = Space.Host.ExecutingObject.Audio ``` ##### Floor[​](#floor "Direct link to Floor") [SRoomFloor](/scripting/client-scripting-api-reference/components/sroomfloor.md) **Floor** `get` *Returns a RoomFloor component attached to this object, or nil if none exist* * Lua ```lua Floor = Space.Host.ExecutingObject.Floor ``` ##### VoiceZone[​](#voicezone "Direct link to VoiceZone") [SVoiceZone](/scripting/client-scripting-api-reference/components/svoicezone.md) **VoiceZone** `get` *Returns a VoiceZone component attached to this object, or nil if none exist* * Lua ```lua VoiceZone = Space.Host.ExecutingObject.VoiceZone ``` ##### Browser[​](#browser "Direct link to Browser") [SBrowserSurface](/scripting/client-scripting-api-reference/components/sbrowsersurface.md) **Browser** `get` *Returns a reference to a BrowserSurface component on the object. Will return null if it does not exist.* * Lua ```lua newBrowserComponent = Space.Host.ExecutingObject.Browser ``` ##### Director[​](#director "Direct link to Director") [SPlayableDirector](/scripting/client-scripting-api-reference/components/splayabledirector.md) **Director** `get` *Returns a PlayableDirector component attached to this object, or nil if none exist* * Lua ```lua Director = Space.Host.ExecutingObject.Director ``` ##### Renderer[​](#renderer "Direct link to Renderer") [SRenderer](/scripting/client-scripting-api-reference/components/srenderer.md) **Renderer** `get` *Returns a reference to a Renderer component on the object. Will return null if it does not exist.* * Lua ```lua renderer = Space.Host.ExecutingObject.Renderer ``` ##### Vehicle[​](#vehicle "Direct link to Vehicle") [SModularVehicle](/scripting/client-scripting-api-reference/components/smodularvehicle.md) **Vehicle** `get` *Returns a Modular Vehicle component attached to this object, or nil if none exist* * Lua ```lua Vehicle = Space.Host.ExecutingObject.Vehicle ``` ##### PostProcessVolume[​](#postprocessvolume "Direct link to PostProcessVolume") [SPostProcessVolume](/scripting/client-scripting-api-reference/components/spostprocessvolume.md) **PostProcessVolume** `get` *Returns a Post Process Volume component attached to this object, or nil if none exist* * Lua ```lua PostProcessVolume = Space.Host.ExecutingObject.PostProcessVolume ``` ##### Archimatix[​](#archimatix "Direct link to Archimatix") SAXModel **Archimatix** `get` *Returns a Archimatix Model ("AXModel" component) - or Nil if nothing exists* * Lua ```lua Archimatix = Space.Host.ExecutingObject.Archimatix ``` ##### Clickable[​](#clickable "Direct link to Clickable") [SClickable](/scripting/client-scripting-api-reference/components/sclickable.md) **Clickable** `get` *Returns a reference to a Clickable component on the object. Will return null if it does not exist.* * Lua ```lua clickableComponent = Space.Host.ExecutingObject.Clickable ``` ##### EmbeddedVideo[​](#embeddedvideo "Direct link to EmbeddedVideo") [SEmbeddedVideo](/scripting/client-scripting-api-reference/components/sembeddedvideo.md) **EmbeddedVideo** `get` *Returns an Embedded Video component attached to this object, or nil if none exist (may not work within editor)* * Lua ```lua EmbeddedVideo = Space.Host.ExecutingObject.EmbeddedVideo ``` ##### Avatar[​](#avatar "Direct link to Avatar") [SAvatar](/scripting/client-scripting-api-reference/types/savatar.md) **Avatar** `get` *A reference to an Avatar component on the GameObject.* * Lua ```lua Avatar = Space.Host.ExecutingObject.Avatar ``` ##### AvatarAppearance[​](#avatarappearance "Direct link to AvatarAppearance") [SAvatarAppearance](/scripting/client-scripting-api-reference/types/savatarappearance.md) **AvatarAppearance** `get` *Returns a AvatarAppearance component attached to this object, or nil if none exist* * Lua ```lua AvatarAppearance = Space.Host.ExecutingObject.AvatarAppearance ``` ##### Script[​](#script "Direct link to Script") [SScriptingRuntime](/scripting/client-scripting-api-reference/components/sscriptingruntime.md) **Script** `get` *Returns a Scripting Runtime component attached to this object, or nil if none exist* * Lua ```lua Script = Space.Host.ExecutingObject.Script ``` ##### StateMachine[​](#statemachine "Direct link to StateMachine") [SStateMachine](/scripting/client-scripting-api-reference/components/sstatemachine.md) **StateMachine** `get` *Returns a State Machine component attached to this object, or nil if none exist* * Lua ```lua StateMachine = Space.Host.ExecutingObject.StateMachine ``` ##### Networking[​](#networking "Direct link to Networking") [SNetworking](/scripting/client-scripting-api-reference/components/snetworking.md) **Networking** `get` *Returns a Simple Networking component attached to this object, or nil if none exists* * Lua ```lua SimpleNetworking = Space.Host.ExecutingObject.Networking ``` ##### Events[​](#events "Direct link to Events") [SScriptingEvents](/scripting/client-scripting-api-reference/components/sscriptingevents.md) **Events** `get` *Property Description* * Lua ```lua eventsComponent = Space.Host.ExecutingObject.Events ``` ##### Resources[​](#resources "Direct link to Resources") [SScriptingResources](/scripting/client-scripting-api-reference/components/sscriptingresources.md) **Resources** `get` *Property Description* * Lua ```lua resourcesComponent = Space.Host.ExecutingObject.Resources ``` ##### Data[​](#data "Direct link to Data") [SScriptingData](/scripting/client-scripting-api-reference/components/sscriptingdata.md) **Data** `get` *Returns a Scripting Data component attached to this object, or nil if none exist* * Lua ```lua Data = Space.Host.ExecutingObject.Data ``` ##### Rigidbody[​](#rigidbody "Direct link to Rigidbody") [SRigidbody](/scripting/client-scripting-api-reference/components/srigidbody.md) **Rigidbody** `get` *Returns a reference to a Rigidbody component on the object. Will return null if it does not exist.* * Lua ```lua rigidbodyComponent = Space.Host.ExecutingObject.Rigidbody ``` ##### Collider[​](#collider "Direct link to Collider") [SCollider](/scripting/client-scripting-api-reference/components/scollider.md) **Collider** `get` *Returns a reference to a Collider component on the object. Will return null if it does not exist.* * Lua ```lua colliderComponent = Space.Host.ExecutingObject.Collider ``` ##### BoxCollider[​](#boxcollider "Direct link to BoxCollider") [SBoxCollider](/scripting/client-scripting-api-reference/components/sboxcollider.md) **BoxCollider** `get` *Returns a Box Collider component attached to this object, or nil if none exist* * Lua ```lua BoxCollider = Space.Host.ExecutingObject.BoxCollider ``` ##### SphereCollider[​](#spherecollider "Direct link to SphereCollider") [SSphereCollider](/scripting/client-scripting-api-reference/components/sspherecollider.md) **SphereCollider** `get` *Returns a Sphere Collider component attached to this object, or nil if none exist* * Lua ```lua SphereCollider = Space.Host.ExecutingObject.SphereCollider ``` ##### CapsuleCollider[​](#capsulecollider "Direct link to CapsuleCollider") [SCapsuleCollider](/scripting/client-scripting-api-reference/components/scapsulecollider.md) **CapsuleCollider** `get` *Returns a Capsule Collider component attached to this object, or nil if none exist* * Lua ```lua CapsuleCollider = Space.Host.ExecutingObject.CapsuleCollider ``` ##### WheelCollider[​](#wheelcollider "Direct link to WheelCollider") [SWheelCollider](#) **WheelCollider** `get` *Returns a WheelCollider component attached to this object, or nil if none exist* * Lua ```lua WheelCollider = Space.Host.ExecutingObject.WheelCollider ``` ##### CharacterController[​](#charactercontroller "Direct link to CharacterController") [SCharacterController](/scripting/client-scripting-api-reference/components/scharactercontroller.md) **CharacterController** `get` *Returns a Character Controller component attached to this object, or nil if none exist* * Lua ```lua CharacterController = Space.Host.ExecutingObject.CharacterController ``` ##### AudioReactive[​](#audioreactive "Direct link to AudioReactive") [SAudioReactiveBase](/scripting/client-scripting-api-reference/components/saudioreactivebase.md) **AudioReactive** `get` *Returns the first Audio Reactive component attached to this object, or nil if none exist* * Lua ```lua AudioReactive = Space.Host.ExecutingObject.AudioReactive ``` ##### AttachmentHelper[​](#attachmenthelper "Direct link to AttachmentHelper") SAttachmentHelper **AttachmentHelper** `get` *Returns the first Attachment Helper component attached to this object, or nil if none exist* * Lua ```lua AttachmentHelper = Space.Host.ExecutingObject.AttachmentHelper ``` ##### AudioReactiveAnimation[​](#audioreactiveanimation "Direct link to AudioReactiveAnimation") [SAudioReactiveAnimation](/scripting/client-scripting-api-reference/components/saudioreactiveanimation.md) **AudioReactiveAnimation** `get` *Returns the first Audio Reactive Animation component attached to this object, or nil if none exist* * Lua ```lua AudioReactiveAnimation = Space.Host.ExecutingObject.AudioReactiveAnimation ``` ##### AudioReactiveLight[​](#audioreactivelight "Direct link to AudioReactiveLight") [SAudioReactiveLight](/scripting/client-scripting-api-reference/components/saudioreactivelight.md) **AudioReactiveLight** `get` *Returns the first Audio Reactive Light component attached to this object, or nil if none exist* * Lua ```lua AudioReactiveLight = Space.Host.ExecutingObject.AudioReactiveLight ``` ##### AudioReactiveParticleSystem[​](#audioreactiveparticlesystem "Direct link to AudioReactiveParticleSystem") [SAudioReactiveParticleSystem](/scripting/client-scripting-api-reference/components/saudioreactiveparticlesystem.md) **AudioReactiveParticleSystem** `get` *Returns the first Audio Reactive Particle System component attached to this object, or nil if none exist* * Lua ```lua AudioReactiveParticleSystem = Space.Host.ExecutingObject.AudioReactiveParticleSystem ``` ##### AudioReactiveMaterial[​](#audioreactivematerial "Direct link to AudioReactiveMaterial") [SAudioReactiveMaterial](/scripting/client-scripting-api-reference/components/saudioreactivelight.md) **AudioReactiveMaterial** `get` *Returns the first Audio Reactive Material component attached to this object, or nil if none exist* * Lua ```lua AudioReactiveMaterial = Space.Host.ExecutingObject.AudioReactiveMaterial ``` ##### AudioReactiveTransform[​](#audioreactivetransform "Direct link to AudioReactiveTransform") [SAudioReactiveTransform](/scripting/client-scripting-api-reference/components/saudioreactivetransform.md) **AudioReactiveTransform** `get` *Returns the first Audio Reactive Transform component attached to this object, or nil if none exist* * Lua ```lua AudioReactiveTransform = Space.Host.ExecutingObject.AudioReactiveTransform ``` ##### TrailRenderer[​](#trailrenderer "Direct link to TrailRenderer") [STrailRenderer](/scripting/client-scripting-api-reference/components/strailrenderer.md) **TrailRenderer** `get` *Returns a Trail Renderer component attached to this object, or nil if none exist* * Lua ```lua TrailRenderer = Space.Host.ExecutingObject.TrailRenderer ``` ##### LineRenderer[​](#linerenderer "Direct link to LineRenderer") [SLineRenderer](/scripting/client-scripting-api-reference/components/slinerenderer.md) **LineRenderer** `get` *Returns a Line Renderer component attached to this object, or nil if none exist* * Lua ```lua LineRenderer = Space.Host.ExecutingObject.LineRenderer ``` ##### UILayout[​](#uilayout "Direct link to UILayout") [SUILayout](/scripting/client-scripting-api-reference/components/suilayout.md) **UILayout** `get` *Returns a Renderer component attached to this object, or nil if none exist* * Lua ```lua UILayout = Space.Host.ExecutingObject.UILayout ``` ##### UIToggle[​](#uitoggle "Direct link to UIToggle") [SUIToggle](/scripting/client-scripting-api-reference/components/suitoggle.md) **UIToggle** `get` *Returns a Unity uGUI Toggle component attached to this object, or nil if none exist* * Lua ```lua UIToggle = Space.Host.ExecutingObject.UIToggle ``` ##### UIDropdown[​](#uidropdown "Direct link to UIDropdown") [SUIDropdown](/scripting/client-scripting-api-reference/components/suidropdown.md) **UIDropdown** `get` *Returns a Unity uGUI Dropdown component attached to this object, or nil if none exist* * Lua ```lua UIDropdown = Space.Host.ExecutingObject.UIDropdown ``` ##### UIButton[​](#uibutton "Direct link to UIButton") [SUIButton](/scripting/client-scripting-api-reference/components/suibutton.md) **UIButton** `get` *Returns a Unity uGUI Dropdown component attached to this object, or nil if none exist* * Lua ```lua UIButton = Space.Host.ExecutingObject.UIButton ``` ##### UIText[​](#uitext "Direct link to UIText") [SUIText](/scripting/client-scripting-api-reference/components/suitext.md) **UIText** `get` *Returns a reference to a UI.Text component on the object. Will return null if it does not exist.* * Lua ```lua uitext = Space.Host.ExecutingObject.UIText ``` ##### UISlider[​](#uislider "Direct link to UISlider") [SUISlider](/scripting/client-scripting-api-reference/components/suislider.md) **UISlider** `get` *Returns a Unity uGUI Slider component attached to this object, or nil if none exist* * Lua ```lua UISlider = Space.Host.ExecutingObject.UISlider ``` ##### UIScrollbar[​](#uiscrollbar "Direct link to UIScrollbar") [SUIScrollbar](/scripting/client-scripting-api-reference/components/suiscrollbar.md) **UIScrollbar** `get` *Returns a Unity uGUI Scrollbar component attached to this object, or nil if none exist* * Lua ```lua UIScrollbar = Space.Host.ExecutingObject.UIScrollbar ``` ##### UICanvas[​](#uicanvas "Direct link to UICanvas") [SUICanvas](/scripting/client-scripting-api-reference/components/suicanvas.md) **UICanvas** `get` *Returns a Unity uGUI Canvas component attached to this object, or nil if none exist* * Lua ```lua UICanvas = Space.Host.ExecutingObject.UICanvas ``` ##### UIImage[​](#uiimage "Direct link to UIImage") [SUIImage](/scripting/client-scripting-api-reference/components/suiimage.md) **UIImage** `get` *Returns a Unity uGUI Image component attached to this object, or nil if none exist* * Lua ```lua UIImage = Space.Host.ExecutingObject.UIImage ``` ##### UIRawImage[​](#uirawimage "Direct link to UIRawImage") [SUIRawImage](/scripting/client-scripting-api-reference/components/suirawimage.md) **UIRawImage** `get` *Returns a Unity uGUI Text component attached to this object, or nil if none exist* * Lua ```lua UIRawImage = Space.Host.ExecutingObject.UIRawImage ``` ##### UIInputField[​](#uiinputfield "Direct link to UIInputField") [SUIInputField](/scripting/client-scripting-api-reference/components/suiinputfield.md) **UIInputField** `get` *Returns a Unity uGUI Text component attached to this object, or nil if none exist* * Lua ```lua UIInputField = Space.Host.ExecutingObject.UIInputField ``` ##### UIToolTipHint[​](#uitooltiphint "Direct link to UIToolTipHint") [SUIToolTipHint](/scripting/client-scripting-api-reference/components/suitooltiphint.md) **UIToolTipHint** `get` *Property Description* * Lua ```lua tooltipHint = Space.Host.ExecutingObject.UIToolTipHint ``` ##### Camera[​](#camera "Direct link to Camera") [SCamera](/scripting/client-scripting-api-reference/components/scamera.md) **Camera** `get` *Property Description* * Lua ```lua camera = Space.Host.ExecutingObject.Camera ``` ##### VirtualCamera[​](#virtualcamera "Direct link to VirtualCamera") [SVirtualCamera](/scripting/client-scripting-api-reference/components/svirtualcamera.md) **VirtualCamera** `get` *Returns a VirtualCamera component attached to this object, or nil if none exists* * Lua ```lua VirtualCamera = Space.Host.ExecutingObject.VirtualCamera ``` ##### Cloth[​](#cloth "Direct link to Cloth") [SCloth](/scripting/client-scripting-api-reference/components/scloth.md) **Cloth** `get` *Returns a Cloth component attached to this object, or nil if none exists* * Lua ```lua Cloth = Space.Host.ExecutingObject.Cloth ``` ##### MeshRenderer[​](#meshrenderer "Direct link to MeshRenderer") [SMeshRenderer](/scripting/client-scripting-api-reference/components/smeshrenderer.md) **MeshRenderer** `get` *Returns a MeshRenderer component attached to this object, or nil if none exists* * Lua ```lua MeshRenderer = Space.Host.ExecutingObject.MeshRenderer ``` ##### Furniture[​](#furniture "Direct link to Furniture") [SFurniture](/scripting/client-scripting-api-reference/components/sfurniture.md) **Furniture** `get` *Returns a Furniture component attached to this object, or nil if none exists* * Lua ```lua Furniture = Space.Host.ExecutingObject.Furniture ``` ##### NavMeshAgent[​](#navmeshagent "Direct link to NavMeshAgent") [SNavMeshAgent](/scripting/client-scripting-api-reference/components/snavmeshagent.md) **NavMeshAgent** `get` *Adds a NavMeshAgent component to the object.* * Lua ```lua navMeshAgent = Space.Host.ExecutingObject.AddNavMeshAgent() ``` ##### NavMeshObstacle[​](#navmeshobstacle "Direct link to NavMeshObstacle") [SNavMeshObstacle](/scripting/client-scripting-api-reference/components/snavmeshobstacle.md) **NavMeshObstacle** `get` *Returns a NavMeshObstacle component attached to this object, or nil if none exists* * Lua ```lua NavMeshObstacle = Space.Host.ExecutingObject.NavMeshObstacle ``` ##### ParticleSystem[​](#particlesystem "Direct link to ParticleSystem") [SParticleSystem](/scripting/client-scripting-api-reference/components/sparticlesystem.md) **ParticleSystem** `get` *Returns a ParticleSystem component attached to this object, or nil if none exists* * Lua ```lua ParticleSystem = Space.Host.ExecutingObject.ParticleSystem ``` ##### RectTransform[​](#recttransform "Direct link to RectTransform") [SRectTransform](/scripting/client-scripting-api-reference/components/srecttransform.md) **RectTransform** `get` *Returns a RectTransform component attached to this object, or nil if none exists* * Lua ```lua RectTransform = Space.Host.ExecutingObject.RectTransform ``` ##### Seat[​](#seat "Direct link to Seat") [SSeat](/scripting/client-scripting-api-reference/components/sseat.md) **Seat** `get` *Returns a reference to a Seat component on the object. Will return null if it does not exist.* * Lua ```lua seatComponent = Space.Host.ExecutingObject.AddSeat() ``` ##### SkinnedMeshRenderer[​](#skinnedmeshrenderer "Direct link to SkinnedMeshRenderer") [SSkinnedMeshRenderer](/scripting/client-scripting-api-reference/components/sskinnedmeshrenderer.md) **SkinnedMeshRenderer** `get` *Returns a SkinnedMeshRenderer component attached to this object, or nil if none exists* * Lua ```lua SkinnedMeshRenderer = Space.Host.ExecutingObject.SkinnedMeshRenderer ``` ##### Radio[​](#radio "Direct link to Radio") [SSceneBackgroundMusic](/scripting/client-scripting-api-reference/components/sscenebackgroundmusic.md) **Radio** `get` *Returns a SceneBackgroundMusic component attached to this object, or nil if none exists* * Lua ```lua Radio = Space.Host.ExecutingObject.Radio ``` ##### Terrain[​](#terrain "Direct link to Terrain") [STerrain](/scripting/client-scripting-api-reference/components/sterrain.md) **Terrain** `get` *Returns a Terrain component attached to this object, or nil if none exists* * Lua ```lua Terrain = Space.Host.ExecutingObject.Terrain ``` ##### AnalyticsEvent[​](#analyticsevent "Direct link to AnalyticsEvent") SAnalyticsEvent **AnalyticsEvent** `get` *Property Description* * Lua ```lua analyticsEvent = Space.Host.ExecutingObject.AnalyticsEvent ``` ##### GraphicRaycaster[​](#graphicraycaster "Direct link to GraphicRaycaster") [SGraphicRaycaster](/scripting/client-scripting-api-reference/components/sgraphicraycaster.md) **GraphicRaycaster** `get` *Property Description* * Lua ```lua graphicRaycaster = Space.Host.ExecutingObject.GraphicRaycaster ``` ##### ContentSizeFitter[​](#contentsizefitter "Direct link to ContentSizeFitter") SContentSizeFitter **ContentSizeFitter** `get` *Property Description* * Lua ```lua contentSzeFitter = Space.Host.ExecutingObject.ContentSizeFitter ``` ##### Active[​](#active "Direct link to Active") bool **Active** `get` `set` *Is this object Active in the scene* * Lua ```lua Space.Host.ExecutingObject.Active = false ``` * Lua ```lua --the below script will make this object become inactive --after being being clicked --(Example: picking up fruits) thisGameObject = Space.Host.ExecutingObject OnClick = function() thisGameObject.Active = false end thisGameObject.AddClickable() thisGameObject.Clickable.Tooltip="Pick me!" thisGameObject.Clickable.OnClick(OnClick) ``` ##### ActiveSelf[​](#activeself "Direct link to ActiveSelf") bool **ActiveSelf** `get` `set` *Returns true if GameObject is Active (even if it's parent is not active)* * Lua ```lua Space.Host.ExecutingObject.ActiveSelf = false ``` ##### Layer[​](#layer "Direct link to Layer") int **Layer** `get` `set` *Gets/Sets the object onto a particular layer (0-31)* * Lua ```lua Space.Host.ExecutingObject.Layer = 21 ``` ##### Tag[​](#tag "Direct link to Tag") string **Tag** `get` *Gets this objects Tag* * Lua ```lua objectTag = Space.Host.ExecutingObject.Tag ``` ##### Name[​](#name "Direct link to Name") string **Name** `get` `set` *Gets/sets the name of this object* * Lua ```lua Space.Host.ExecutingObject.Name = 'Hello World!' ``` ##### Moniker[​](#moniker "Direct link to Moniker") string? **Moniker** `get` `set` *Property Description* * Lua ```lua Space.Host.ExecutingObject.Moniker = 'New Moniker' ``` ##### Parent[​](#parent "Direct link to Parent") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **Parent** `get` `set` *Gets/sets the parent GameObject of this object. Assign nil/null to set this as the root.* * Lua ```lua Space.Host.ExecutingObject.Parent = Space.Host.GetReference("TheOtherObject") ``` ##### Root[​](#root "Direct link to Root") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **Root** `get` *Gets the root of this object group - may be this object.* * Lua ```lua objectRoot = Space.Host.ExecutingObject.Root ``` ##### Children[​](#children "Direct link to Children") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md)\[] **Children** `get` *Returns the list of direct children of this object.* * Lua ```lua tableChildren = Space.Host.ExecutingObject.Children ``` ##### WorldPosition[​](#worldposition "Direct link to WorldPosition") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **WorldPosition** `get` `set` *Gets or sets the current position of this object relative to the scene* * Lua ```lua Space.Host.ExecutingObject.WorldPosition = Vector.New(1,1,1) ``` ##### LocalPosition[​](#localposition "Direct link to LocalPosition") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **LocalPosition** `get` `set` *Gets or sets the current position of this object relative to the objects parent, taking into account local position/scale/rotation* * Lua ```lua Space.Host.ExecutingObject.LocalPosition = Vector.New(1,1,1) ``` ##### WorldRotation[​](#worldrotation "Direct link to WorldRotation") [SQuaternion](/scripting/client-scripting-api-reference/types/squaternion.md) **WorldRotation** `get` `set` *Gets or sets the current rotation of this object relative to the scene* * Lua ```lua Space.Host.ExecutingObject.WorldRotation = Quaternion.Euler(0,180,0) ``` ##### LocalRotation[​](#localrotation "Direct link to LocalRotation") [SQuaternion](/scripting/client-scripting-api-reference/types/squaternion.md) **LocalRotation** `get` `set` *Gets or sets the current rotation of this object relative to the parent object* * Lua ```lua Space.Host.ExecutingObject.LocalRotation = Quaternion.Euler(0,180,0) ``` ##### LocalScale[​](#localscale "Direct link to LocalScale") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **LocalScale** `get` `set` *Gets or sets the current scale of this object relative to the parent* * Lua ```lua Space.Host.ExecutingObject.LocalScale = Vector.New(2,2,2) ``` ##### WorldScale[​](#worldscale "Direct link to WorldScale") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **WorldScale** `get` *Gets the current scale of this object relative to the scene* * Lua ```lua worldScale = Space.Host.ExecutingObject.WorldScale ``` ##### Forward[​](#forward "Direct link to Forward") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **Forward** `get` *Returns the forward direction vector of this game object (blue arrow)* * Lua ```lua vectorForward = Space.Host.ExecutingObject.Forward ``` ##### Up[​](#up "Direct link to Up") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **Up** `get` *Returns the up direction vector of this game object (green arrow)* * Lua ```lua vectorUp = Space.Host.ExecutingObject.Up ``` ##### Right[​](#right "Direct link to Right") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **Right** `get` *Returns the right direction vector of this game object (red arrow)* * Lua ```lua vectorRight = Space.Host.ExecutingObject.Right ``` ##### **EventCalendar**[​](#eventcalendar "Direct link to eventcalendar") [SEventCalendar](/scripting/client-scripting-api-reference/components/seventcalendar.md) **EventCalendar** `get` *Returns an EventCalendar component attached to this object, or nil if none exists* * Lua ```lua EventCalendar = Space.Host.ExecutingObject.EventCalendar ``` --- ### SGenre #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | ----------------------------------------------------------------------------------------------------- | | override string [**ToString** ](/scripting/client-scripting-api-reference/types/sgenre.md#tostring)() | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ----------------------------------------------------------------------------------------------------------- | | string [**Name** ](/scripting/client-scripting-api-reference/types/sgenre.md#name)`get` `set` | | string [**ID** ](/scripting/client-scripting-api-reference/types/sgenre.md#id)`get` `set` | | string [**HasChildren** ](/scripting/client-scripting-api-reference/types/sgenre.md#haschildren)`get` `set` | | string [**ParentID** ](/scripting/client-scripting-api-reference/types/sgenre.md#parentid)`get` `set` | #### Functions[​](#functions "Direct link to Functions") ##### ToString[​](#tostring "Direct link to ToString") override string **ToString** () *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` #### Properties[​](#properties "Direct link to Properties") ##### Name[​](#name "Direct link to Name") string **Name** `get` `set` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` ##### ID[​](#id "Direct link to ID") string **ID** `get` `set` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` ##### HasChildren[​](#haschildren "Direct link to HasChildren") string **HasChildren** `get` `set` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` ##### ParentID[​](#parentid "Direct link to ParentID") string **ParentID** `get` `set` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` --- ### SGroupInfo #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | --------------------------------------------------------------------------------------------------------- | | int [**ID** ](/scripting/client-scripting-api-reference/types/sgroupinfo.md#id)`get` | | int [**OwnerID** ](/scripting/client-scripting-api-reference/types/sgroupinfo.md#ownerid)`get` | | string [**Name** ](/scripting/client-scripting-api-reference/types/sgroupinfo.md#name)`get` | | string [**Description** ](/scripting/client-scripting-api-reference/types/sgroupinfo.md#description)`get` | | string [**Access** ](/scripting/client-scripting-api-reference/types/sgroupinfo.md#access)`get` | | string [**ImageUrl** ](/scripting/client-scripting-api-reference/types/sgroupinfo.md#imageurl)`get` | | int [**MaxAvatars** ](/scripting/client-scripting-api-reference/types/sgroupinfo.md#maxavatars)`get` | | string [**Role** ](/scripting/client-scripting-api-reference/types/sgroupinfo.md#role)`get` | | string [**CreateDate** ](/scripting/client-scripting-api-reference/types/sgroupinfo.md#createdate)`get` | #### Properties[​](#properties "Direct link to Properties") ##### ID[​](#id "Direct link to ID") int **ID** `get` *The ID of the group.* * Lua ```lua ID = Space.Groups.GetGroupInfo(350).ID ``` ##### OwnerID[​](#ownerid "Direct link to OwnerID") int **OwnerID** `get` *The ID of the group's owner.* * Lua ```lua OwnerID = Space.Groups.GetGroupInfo(350).OwnerID ``` * Lua ```lua --Clicking this object will show canvas1 if you are a group's owner --and will show canvas2 if you are not thisObject = Space.Host.ExecutingObject canvas1 = Space.Host.GetReference("canvas1")--Add this object with canvas as reference in Scripting Runtime canvas2 = Space.Host.GetReference("canvas2")--Add this object with canvas as reference in Scripting Runtime OnClickFunction = function() local groupInfo = Space.Groups.GetGroupInfo(350) if groupInfo.OwnerID == Space.Scene.PlayerAvatar.ID then canvas1.Active = true else canvas2.Active = true end end ``` ##### Name[​](#name "Direct link to Name") string **Name** `get` *The name of the group.* * Lua ```lua Name = Space.Groups.GetGroupInfo(350).Name ``` * Lua ```lua --Clicking this object will show group 355's Name on a UIText object thisObject = Space.Host.ExecutingObject uiText = Space.Host.GetReference("text").UIText --Add this object with UIText component as reference in Scripting Runtime OnClickFunction = function() GroupInfo = Space.Groups.GetGroupInfo(350) uiText.Text = GroupInfo.Name end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### Description[​](#description "Direct link to Description") string **Description** `get` *The description of the group.* * Lua ```lua Description =Space.Groups.GetGroupInfo(350).Description ``` * Lua ```lua --Clicking this object will show group 355's Description on a UIText object thisObject = Space.Host.ExecutingObject uiText = Space.Host.GetReference("text").UIText --Add this object with UIText component as reference in Scripting Runtime OnClickFunction = function() GroupInfo = Space.Groups.GetGroupInfo(350) uiText.Text = GroupInfo.Description end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### Access[​](#access "Direct link to Access") string **Access** `get` *The level of access the group has, e.g. public or private.* * Lua ```lua Access = Space.Groups.GetGroupInfo(350).Access ``` * Lua ```lua --Clicking this object will show group 355's Access on a UIText object thisObject = Space.Host.ExecutingObject uiText = Space.Host.GetReference("text").UIText --Add this object with UIText component as reference in Scripting Runtime OnClickFunction = function() GroupInfo = Space.Groups.GetGroupInfo(350) uiText.Text = GroupInfo.Access end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### ImageUrl[​](#imageurl "Direct link to ImageUrl") string **ImageUrl** `get` *The URL of the group's image.* * Lua ```lua ImageUrl = Space.Groups.GetGroupInfo(350).ImageUrl ``` * Lua ```lua --Clicking this object will show group 355's ImageUrl on a UIText object thisObject = Space.Host.ExecutingObject uiText = Space.Host.GetReference("text").UIText --Add this object with UIText component as reference in Scripting Runtime OnClickFunction = function() GroupInfo = Space.Groups.GetGroupInfo(350) uiText.Text = GroupInfo.ImageUrl end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### MaxAvatars[​](#maxavatars "Direct link to MaxAvatars") int **MaxAvatars** `get` *The max number of members the group can have.* * Lua ```lua MaxAvatars = Space.Groups.GetGroupInfo(350).MaxAvatars ``` * Lua ```lua --Clicking this object will show group 355's MaxAvatars on a UIText object thisObject = Space.Host.ExecutingObject uiText = Space.Host.GetReference("text").UIText --Add this object with UIText component as reference in Scripting Runtime OnClickFunction = function() GroupInfo = Space.Groups.GetGroupInfo(350) uiText.Text = GroupInfo.MaxAvatars end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### Role[​](#role "Direct link to Role") string **Role** `get` *Player's role in this group.* * Lua ```lua Role = Space.Groups.GetGroupInfo(350).Role ``` * Lua ```lua --Clicking this object will show canvas1 if you are a VIP in the group --and will show canvas2 if you are a regular member --and will show canvas3 if you are the group owner thisObject = Space.Host.ExecutingObject canvas1 = Space.Host.GetReference("canvas1")--Add this object with canvas as reference in Scripting Runtime canvas2 = Space.Host.GetReference("canvas2")--Add this object with canvas as reference in Scripting Runtime canvas3 = Space.Host.GetReference("canvas3")--Add this object with canvas as reference in Scripting Runtime OnClickFunction = function() local groupInfo = Space.Groups.GetGroupInfo(350) if groupInfo.Role == "Owner" then canvas3.Active = true elseif groupInfo.Role == "VIP" then canvas1.Active = true elseif groupInfo.Role == "Normal" then canvas2.Active = true end end ``` ##### CreateDate[​](#createdate "Direct link to CreateDate") string **CreateDate** `get` *Creation date of the group.* * Lua ```lua CreateDate = Space.Groups.GetGroupInfo(350).CreateDate ``` * Lua ```lua --Clicking this object will show group 355's creation date on a UIText object thisObject = Space.Host.ExecutingObject uiText = Space.Host.GetReference("text").UIText --Add this object with UIText component as reference in Scripting Runtime OnClickFunction = function() CreateDate = Space.Groups.GetGroupInfo(350).CreateDate uiText.Text = CreateDate end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` --- ### SInventoryItem #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | --------------------------------------------------------------------------------------------------------------------------- | | bool [**StoreCustomData** ](/scripting/client-scripting-api-reference/types/sinventoryitem.md#storecustomdata)(string data) | | void [**Use** ](/scripting/client-scripting-api-reference/types/sinventoryitem.md#use)() | | void [**Delete** ](/scripting/client-scripting-api-reference/types/sinventoryitem.md#delete)() | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ------------------------------------------------------------------------------------------------------------- | | long [**MasterID** ](/scripting/client-scripting-api-reference/types/sinventoryitem.md#masterid)`get` | | long [**PlayerItemID** ](/scripting/client-scripting-api-reference/types/sinventoryitem.md#playeritemid)`get` | | string [**Name** ](/scripting/client-scripting-api-reference/types/sinventoryitem.md#name)`get` | | string [**Description** ](/scripting/client-scripting-api-reference/types/sinventoryitem.md#description)`get` | | string [**Brand** ](/scripting/client-scripting-api-reference/types/sinventoryitem.md#brand)`get` | | string [**CustomData** ](/scripting/client-scripting-api-reference/types/sinventoryitem.md#customdata)`get` | #### Functions[​](#functions "Direct link to Functions") ##### StoreCustomData[​](#storecustomdata "Direct link to StoreCustomData") bool **StoreCustomData** (string data) *Updates the inventory items custom data, and requests a synchronisation with the inventory server. It may not update on the server immediately, but all local calls will reflect the new data. Note: this request can be rate limited and should only be called from a user initiated action (such as clicking a button). Updates to custom data must not be initiated on a timer or regular automatic event. Access to this function can be blacklisted to specific creators if abused.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Items = Space.Inventory.Items Items[1].StoreCustomData('data1data2data3') ``` ##### Use[​](#use "Direct link to Use") void **Use** () *Player will 'Use' this item. (White-label only)* * Lua ```lua Items = Space.Inventory.Items Items[1].Use() ``` ##### Delete[​](#delete "Direct link to Delete") void **Delete** () *Player will 'Delete' this item. (White-label only)* * Lua ```lua Items = Space.Inventory.Items Items[1].Delete() ``` #### Properties[​](#properties "Direct link to Properties") ##### MasterID[​](#masterid "Direct link to MasterID") long **MasterID** `get` *The master ID for this item - also known as the Curator ID or Item ID, this is the ID for the master item from which this copy exists.* * Lua ```lua Items = Space.Inventory.Items iMasterID = Items[1].MasterID ``` ##### PlayerItemID[​](#playeritemid "Direct link to PlayerItemID") long **PlayerItemID** `get` *The instance ID for this item - this is guaranteed to be unique per inventory item* * Lua ```lua Items = Space.Inventory.Items iPlayerItemID= Items[1].PlayerItemID ``` ##### Name[​](#name "Direct link to Name") string **Name** `get` *Returns the name of the inventory item* * Lua ```lua Items = Space.Inventory.Items iName= Items[1].Name ``` ##### Description[​](#description "Direct link to Description") string **Description** `get` *Returns the registered description of the inventory item in the users locale* * Lua ```lua Items = Space.Inventory.Items iDescription=Items[1].Description ``` ##### Brand[​](#brand "Direct link to Brand") string **Brand** `get` *Returns brand information about the item* * Lua ```lua Items = Space.Inventory.Items iBrand = Items[1].Brand ``` ##### CustomData[​](#customdata "Direct link to CustomData") string **CustomData** `get` *Returns any custom data associated with this item, typically used for 'game' items* * Lua ```lua Items = Space.Inventory.Items iCustomData = Items[1].CustomData ``` --- ### SJointLimits #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | override string [**ToString** ](/scripting/client-scripting-api-reference/types/sjointlimits.md#tostring)() | | static SJointLimits [**New** ](/scripting/client-scripting-api-reference/types/sjointlimits.md#new)(float min, float max, float bounciness, float bounceMinVelocity, float contactDistance) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ---------------------------------------------------------------------------------------------------------------------------- | | float [**Min** ](/scripting/client-scripting-api-reference/types/sjointlimits.md#min)`get` `set` | | float [**Max** ](/scripting/client-scripting-api-reference/types/sjointlimits.md#max)`get` `set` | | float [**Bounciness** ](/scripting/client-scripting-api-reference/types/sjointlimits.md#bounciness)`get` `set` | | float [**BounceMinVelocity** ](/scripting/client-scripting-api-reference/types/sjointlimits.md#bounceminvelocity)`get` `set` | | float [**ContactDistance** ](/scripting/client-scripting-api-reference/types/sjointlimits.md#contactdistance)`get` `set` | #### Functions[​](#functions "Direct link to Functions") ##### ToString[​](#tostring "Direct link to ToString") override string **ToString** () *Returns this SJointLimits's properties as a string* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua LimitsString = Space.Host.ExecutingObject.HingeJoint.Limits.ToString() ``` * Lua ```lua --the below script will make a UI Text element display this GameObjects Hinge Joint Limits' properties --[Add "thetext" and "thehingejoint" reference to the Scripting Runtime component] thisObject = Space.Host.ExecutingObject text = Space.Host.GetReference("thetext").UIText hingejoint = Space.Host.GetReference("thehingejoint").HingeJoint function OnUpdateFunction() limits = hingejoint.Limits text.Text = limits.ToString() end thisObject.OnUpdate(OnUpdateFunction) ``` ##### New[​](#new "Direct link to New") static SJointLimits **New** (float min, float max, float bounciness, float bounceMinVelocity, float contactDistance) *Creates a new SJoinLimits with the given min, max, bounciness, bounceMinVelocity and contactDistance.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Limits = Space.Host.ExecutingObject.HingeJoint.Limits.New((1,2,3,4,5)) ``` * Lua ```lua --the below script will change all Hinge Joint Limits properties to 0 when clicked --[Add "thehingejoint" reference to the Scripting Runtime component] thisObject = Space.Host.ExecutingObject hingejoint = Space.Host.GetReference("thehingejoint").HingeJoint function OnClickFunction() limits = hingejoint.Limits hingejoint.Limits = limits.New(0,0,0,0,0) end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` #### Properties[​](#properties "Direct link to Properties") ##### Min[​](#min "Direct link to Min") float **Min** `get` `set` *The lower angular limit (in degrees) of the joint.* * Lua ```lua LimitsMin = Space.Host.ExecutingObject.HingeJoint.Limits.Min ``` * Lua ```lua --the below script will make a slider change a Hinge Joint Limits Min property --[Add "theslider" and "thehingejoint" reference to the Scripting Runtime component] slider = Space.Host.GetReference("theslider").UISlider hingejoint = Space.Host.GetReference("thehingejoint").HingeJoint OVC = function() limits = hingejoint.Limits limits.Min = (slider.Value * 10.0) -- from 0.0 to 10.0 hingejoint.Limits = limits end slider.OnValueChanged(OVC) ``` ##### Max[​](#max "Direct link to Max") float **Max** `get` `set` *The upper angular limit (in degrees) of the joint.* * Lua ```lua LimitsMax= Space.Host.ExecutingObject.HingeJoint.Limits.Max ``` * Lua ```lua --the below script will make a slider change a Hinge Joint Limits Max property --[Add "theslider" and "thehingejoint" reference to the Scripting Runtime component] slider = Space.Host.GetReference("theslider").UISlider hingejoint = Space.Host.GetReference("thehingejoint").HingeJoint OVC = function() limits = hingejoint.Limits limits.Max = (slider.Value * 10.0) -- from 0.0 to 10.0 hingejoint.Limits = limits end slider.OnValueChanged(OVC) ``` ##### Bounciness[​](#bounciness "Direct link to Bounciness") float **Bounciness** `get` `set` *Determines the size of the bounce when the joint hits it's limit. Also known as restitution.* * Lua ```lua LimitsBounciness = Space.Host.ExecutingObject.HingeJoint.Limits.Bounciness ``` * Lua ```lua --the below script will make a slider change a Hinge Joint Limits Bounciness property --[Add "theslider" and "thehingejoint" reference to the Scripting Runtime component] slider = Space.Host.GetReference("theslider").UISlider hingejoint = Space.Host.GetReference("thehingejoint").HingeJoint OVC = function() limits = hingejoint.Limits limits.Bounciness = (slider.Value * 1.0) -- from 0.0 to 1.0 hingejoint.Limits = limits end slider.OnValueChanged(OVC) ``` ##### BounceMinVelocity[​](#bounceminvelocity "Direct link to BounceMinVelocity") float **BounceMinVelocity** `get` `set` *The minimum impact velocity which will cause the joint to bounce.* * Lua ```lua LimitsBounceMinVelocity = Space.Host.ExecutingObject.HingeJoint.Limits.BounceMinVelocity ``` * Lua ```lua --the below script will make a slider change a Hinge Joint Limits BounceMinVelocity property --[Add "theslider" and "thehingejoint" reference to the Scripting Runtime component] slider = Space.Host.GetReference("theslider").UISlider hingejoint = Space.Host.GetReference("thehingejoint").HingeJoint OVC = function() limits = hingejoint.Limits limits.BounceMinVelocity = (slider.Value * 10.0) -- from 0.0 to 10.0 hingejoint.Limits = limits end slider.OnValueChanged(OVC) ``` ##### ContactDistance[​](#contactdistance "Direct link to ContactDistance") float **ContactDistance** `get` `set` *Distance inside the limit value at which the limit will be considered to be active by the solver.* * Lua ```lua LimitsContactDistance = Space.Host.ExecutingObject.HingeJoint.Limits.ContactDistance ``` * Lua ```lua --the below script will make a slider change a Hinge Joint Limits Contact Distance property --[Add "theslider" and "thehingejoint" reference to the Scripting Runtime component] slider = Space.Host.GetReference("theslider").UISlider hingejoint = Space.Host.GetReference("thehingejoint").HingeJoint OVC = function() limits = hingejoint.Limits limits.ContactDistance = (slider.Value * 10.0) -- from 0.0 to 10.0 hingejoint.Limits = limits end slider.OnValueChanged(OVC) ``` --- ### SJointMotor #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | --------------------------------------------------------------------------------------------------------------------------------------------------- | | override string [**ToString** ](/scripting/client-scripting-api-reference/types/sjointmotor.md#tostring)() | | static SJointMotor [**New** ](/scripting/client-scripting-api-reference/types/sjointmotor.md#new)(float targetVelocity, float force, bool freeSpin) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | --------------------------------------------------------------------------------------------------------------- | | float [**TargetVelocity** ](/scripting/client-scripting-api-reference/types/sjointmotor.md#targetvelocity)`get` | | float [**Force** ](/scripting/client-scripting-api-reference/types/sjointmotor.md#force)`get` | | bool [**FreeSpin** ](/scripting/client-scripting-api-reference/types/sjointmotor.md#freespin)`get` | #### Functions[​](#functions "Direct link to Functions") ##### ToString[​](#tostring "Direct link to ToString") override string **ToString** () *Returns this SJointMotor's properties as a string* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua MotorString = Space.Host.ExecutingObject.HingeJoint.Motor.ToString() ``` * Lua ```lua --the below script will make a UI Text element display this GameObjects Hinge Joint Motor properties --[Add "thetext" and "thehingejoint" reference to the Scripting Runtime component] thisObject = Space.Host.ExecutingObject text = Space.Host.GetReference("thetext").UIText hingejoint = Space.Host.GetReference("thehingejoint").HingeJoint function OnUpdateFunction() motor = hingejoint.Motor text.Text = motor.ToString() end thisObject.OnUpdate(OnUpdateFunction) ``` ##### New[​](#new "Direct link to New") static SJointMotor **New** (float targetVelocity, float force, bool freeSpin) *Creates a new SJointMotor with the given targetVelocity, force, freeSpin.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Motor= Space.Host.ExecutingObject.HingeJoint.Motor.New(1,2,true) ``` * Lua ```lua --the below script will change all Hinge Joint Motor properties to 0 when clicked --[Add "thehingejoint" reference to the Scripting Runtime component] thisObject = Space.Host.ExecutingObject hingejoint = Space.Host.GetReference("thehingejoint").HingeJoint function OnClickFunction() motor = hingejoint.Motor hingejoint.Motor = motor.New(0,0,false) end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` #### Properties[​](#properties "Direct link to Properties") ##### TargetVelocity[​](#targetvelocity "Direct link to TargetVelocity") float **TargetVelocity**`get` *The motor will apply a force up to force to achieve targetVelocity.* * Lua ```lua MotorTargetVelocity = Space.Host.ExecutingObject.HingeJoint.Motor.TargetVelocity ``` * Lua ```lua --the below script will make a slider change a Hinge Joint Motor TargetVelocity property --[Add "theslider" and "thehingejoint" reference to the Scripting Runtime component] slider = Space.Host.GetReference("theslider").UISlider hingejoint = Space.Host.GetReference("thehingejoint").HingeJoint OVC = function() motor = hingejoint.Motor motor.TargetVelocity = (slider.Value * 10.0) -- from 0.0 to 10.0 hingejoint.Motor = motor end slider.OnValueChanged(OVC) ``` ##### Force[​](#force "Direct link to Force") float **Force**`get` *The motor will apply a force.* * Lua ```lua MotorForce= Space.Host.ExecutingObject.HingeJoint.Motor.Force ``` * Lua ```lua --the below script will make a slider change a Hinge Joint Motor Force property --[Add "theslider" and "thehingejoint" reference to the Scripting Runtime component] slider = Space.Host.GetReference("theslider").UISlider hingejoint = Space.Host.GetReference("thehingejoint").HingeJoint OVC = function() motor = hingejoint.Motor motor.Force = (slider.Value * 10.0) -- from 0.0 to 10.0 hingejoint.Motor = motor end slider.OnValueChanged(OVC) ``` ##### FreeSpin[​](#freespin "Direct link to FreeSpin") bool **FreeSpin**`get` *If freeSpin is enabled the motor will only accelerate but never slow down.* * Lua ```lua MotorFreeSpin = Space.Host.ExecutingObject.HingeJoint.Motor.FreeSpin ``` * Lua ```lua --the below script will toggle Hinge Joint Motor FreeSpin property --[Add "thehingejoint" reference to the Scripting Runtime component] thisGameObject = Space.Host.ExecutingObject hingejoint = Space.Host.GetReference("thehingejoint").HingeJoint function OnClickFunction() motor = hingejoint.Motor motor.FreeSpin = not motor.FreeSpin hingejoint.Motor = motor end thisGameObject.AddClickable() thisGameObject.Clickable.OnClick(OnClickFunction) ``` --- ### SJointSpring #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function Name | | ----------------------------------------------------------------------------------------------------------------------------------------------------- | | override string [**ToString** ](/scripting/client-scripting-api-reference/types/sjointspring.md#tostring)() | | static SJointSpring [**New** ](/scripting/client-scripting-api-reference/types/sjointspring.md#new)(float spring, float damper, float targetPosition) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ---------------------------------------------------------------------------------------------------------------- | | float [**Spring** ](/scripting/client-scripting-api-reference/types/sjointspring.md#spring)`get` | | float [**Damper** ](/scripting/client-scripting-api-reference/types/sjointspring.md#damper)`get` | | float [**TargetPosition** ](/scripting/client-scripting-api-reference/types/sjointspring.md#targetposition)`get` | #### Functions[​](#functions "Direct link to Functions") ##### ToString[​](#tostring "Direct link to ToString") override string **ToString** () *Returns this SJointSpring's properties as a string* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua SpringString = Space.Host.ExecutingObject.HingeJoint.Spring.ToString() ``` * Lua ```lua --the below script will make a UI Text element display this GameObjects Hinge Joint Spring properties --[Add "thetext" and "thehingejoint" reference to the Scripting Runtime component] thisObject = Space.Host.ExecutingObject text = Space.Host.GetReference("thetext").UIText hingejoint = Space.Host.GetReference("thehingejoint").HingeJoint function OnUpdateFunction() spring = hingejoint.Spring text.Text = spring.ToString() end thisObject.OnUpdate(OnUpdateFunction) ``` ##### New[​](#new "Direct link to New") static SJointSpring **New** (float spring, float damper, float targetPosition) *Creates a new SJointSpring with the given spring, damper, targetPosition.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Motor= Space.Host.ExecutingObject.HingeJoint.Spring.New(1,2,3) ``` * Lua ```lua --the below script will change all Hinge Joint Spring properties to 0 when clicked --[Add "thehingejoint" reference to the Scripting Runtime component] thisObject = Space.Host.ExecutingObject hingejoint = Space.Host.GetReference("thehingejoint").HingeJoint function OnClickFunction() spring = hingejoint.Spring hingejoint.Spring = spring .New(0,0,0) end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` #### Properties[​](#properties "Direct link to Properties") ##### Spring[​](#spring "Direct link to Spring") float **Spring**`get` *The spring forces used to reach the target position.* * Lua ```lua SpringSpring= Space.Host.ExecutingObject.HingeJoint.Spring.Spring ``` * Lua ```lua --the below script will make a slider change a Hinge Joint Spring Spring property --[Add "theslider" and "thehingejoint" reference to the Scripting Runtime component] slider = Space.Host.GetReference("theslider").UISlider hingejoint = Space.Host.GetReference("thehingejoint").HingeJoint OVC = function() spring = hingejoint.Spring spring.Spring = (slider.Value * 10.0) -- from 0.0 to 10.0 hingejoint.Spring= spring end slider.OnValueChanged(OVC) ``` ##### Damper[​](#damper "Direct link to Damper") float **Damper**`get` *The damper force uses to dampen the spring.* * Lua ```lua SpringDamper= Space.Host.ExecutingObject.HingeJoint.Spring.Damper ``` * Lua ```lua --the below script will make a slider change a Hinge Joint Spring Damper property --[Add "theslider" and "thehingejoint" reference to the Scripting Runtime component] slider = Space.Host.GetReference("theslider").UISlider hingejoint = Space.Host.GetReference("thehingejoint").HingeJoint OVC = function() spring = hingejoint.Spring spring.Damper = (slider.Value * 10.0) -- from 0.0 to 10.0 hingejoint.Spring = spring end slider.OnValueChanged(OVC) ``` ##### TargetPosition[​](#targetposition "Direct link to TargetPosition") float **TargetPosition**`get` *The target position the joint attempts to reach.* * Lua ```lua SpringTargetPosition = Space.Host.ExecutingObject.HingeJoint.Spring.TargetPosition ``` * Lua ```lua --the below script will make a slider change a Hinge Joint Spring TargetPosition property --[Add "theslider" and "thehingejoint" reference to the Scripting Runtime component] slider = Space.Host.GetReference("theslider").UISlider hingejoint = Space.Host.GetReference("thehingejoint").HingeJoint OVC = function() spring = hingejoint.Spring spring.TargetPosition = (slider.Value * 10.0) -- from 0.0 to 10.0 hingejoint.Spring = spring end slider.OnValueChanged(OVC) ``` --- ### SLandmark ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ------------------------------------------------------------------------------------------------------- | | string [**Name** ](/scripting/client-scripting-api-reference/types/slandmark.md#name)`get` | | SVector [**Position** ](/scripting/client-scripting-api-reference/types/slandmark.md#position)`get` | | SQuaternion [**Rotation** ](/scripting/client-scripting-api-reference/types/slandmark.md#rotation)`get` | | bool [**SpawnPoint** ](/scripting/client-scripting-api-reference/types/slandmark.md#spawnpoint)`get` | | float [**SpawnRadius** ](/scripting/client-scripting-api-reference/types/slandmark.md#spawnradius)`get` | | SLandmarkType [**Type** ](/scripting/client-scripting-api-reference/types/slandmark.md#type)`get` | #### Properties[​](#properties "Direct link to Properties") ##### Name[​](#name "Direct link to Name") string **Name** `get` *Landmark's Name* * Lua ```lua LandmarkName = Space.Scene.Landmarks[1].Name ``` ##### Position[​](#position "Direct link to Position") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **Position** `get` *Landmark's Position* * Lua ```lua LandmarkPosition = Space.Scene.Landmarks[1].Position ``` ##### Rotation[​](#rotation "Direct link to Rotation") [SQuaternion](/scripting/client-scripting-api-reference/types/squaternion.md) **Rotation** `get` *Landmark's Rotation* * Lua ```lua LandmarkRotation = Space.Scene.Landmarks[1].Rotation ``` ##### SpawnPoint[​](#spawnpoint "Direct link to SpawnPoint") bool **SpawnPoint** `get` *Is this Landmark a spawn point?* * Lua ```lua LandmarkSpawnPoint = Space.Scene.Landmarks[1].SpawnPoint ``` ##### SpawnRadius[​](#spawnradius "Direct link to SpawnRadius") float **SpawnRadius** `get` *The size of the radius around the Landmark where players spawn within* * Lua ```lua LandmarkSpawnRadius = Space.Scene.Landmarks[1].SpawnRadius ``` ##### Type[​](#type "Direct link to Type") int **Type** `get` *The type of Landmark*
*1= LandingZone, 2= Area, 3= Shop, 4= Quest,5= Activity, 6= Teleport, 7= Music, 8= Dance, 9= Clothes, 10= Vehicle, 11= Item* * Lua ```lua LandmarkType = Space.Scene.Landmarks[1].Type ``` --- ### SLayerMask #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function | | --------------------------------------------------------------------------------------------------------------------------------------------- | | void [**SetLayers** ](slayermask#setlayers)(params string\[] layerNames)
void [**SetLayers** ](slayermask#setlayers)(Table layerNames) | | void [**AddLayer** ](/scripting/client-scripting-api-reference/types/slayermask.md#addlayer)(string layerName) | | void [**RemoveLayer** ](/scripting/client-scripting-api-reference/types/slayermask.md#removelayer)(string layerName) | | | | **Static Functions** | | static SLayerMask [**New** ](slayermask#new)(Table layerNames)
static SLayerMask [**New** ](slayermask#new)(params string\[] layerNames) | | | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property | Description | | -------------------------------------------------------------------------------------------------------- | ---------------------------------------------- | | bool [**Inverted** ](/scripting/client-scripting-api-reference/types/slayermask.md#new-1)`get` `set` | Is the mask exclusionary or not. | | string\[] [**Layers** ](/scripting/client-scripting-api-reference/types/slayermask.md#layers)`get` `set` | The layer names represented in this layer mask | #### Functions[​](#functions "Direct link to Functions") ##### SetLayers[​](#setlayers "Direct link to SetLayers") void **SetLayers** (params string\[] layerNames)
void **SetLayers** (Table layerNames) \_Function that changes an existing layer mask \_ | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua -- Let's create a new layer mask to filter out other avatars, then overwrite it to be vehicles instead: local mask = LayerMask.New({"Avatars"}); mask.SetLayers({"Vehicles"}); local hit = Space.Physics.RaycastSingle(Space.Host.ExecutingObject.WorldPosition, Space.Host.ExecutingObject.Forward, 500.0, mask) ``` * Lua ```lua -- Let's create a new layer mask to filter out other avatars, then overwrite it to be vehicles instead: local mask = LayerMask.New("Avatars"); mask.SetLayers("Vehicles"); local hit = Space.Physics.RaycastSingle(Space.Host.ExecutingObject.WorldPosition, Space.Host.ExecutingObject.Forward, 500.0, mask) ``` ##### AddLayer[​](#addlayer "Direct link to AddLayer") void **AddLayer** (string layerName) *Add a new layer to an existing layer mask.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local mask = LayerMask.New("Avatars"); mask.AddLayer("Vehicles"); local hit = Space.Physics.RaycastSingle(Space.Host.ExecutingObject.WorldPosition, Space.Host.ExecutingObject.Forward, 500.0, mask) ``` * Lua ```lua local mask = LayerMask.New("Avatars"); mask.AddLayer("Vehicles"); local hit = Space.Physics.RaycastSingle(Space.Host.ExecutingObject.WorldPosition, Space.Host.ExecutingObject.Forward, 500.0, mask) ``` ##### RemoveLayer[​](#removelayer "Direct link to RemoveLayer") void **RemoveLayer** (string layerName)| *Remove a new layer from an existing layer mask.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local mask = LayerMask.New("Avatars", "Vehicles", "UI"); mask.RemoveLayer("Vehicles"); local hit = Space.Physics.RaycastSingle(Space.Host.ExecutingObject.WorldPosition, Space.Host.ExecutingObject.Forward, 500.0, mask) ``` * Lua ```lua local mask = LayerMask.New("Avatars", "Vehicles", "UI"); mask.RemoveLayer("Vehicles"); local hit = Space.Physics.RaycastSingle(Space.Host.ExecutingObject.WorldPosition, Space.Host.ExecutingObject.Forward, 500.0, mask) ``` ##### New[​](#new "Direct link to New") static SLayerMask **New** (Table layerNames)
static SLayerMask **New** (params string\[] layerNames) *Static function that creates a new layer mask* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local mask = LayerMask.New({"Avatars", "Vehicles"}); local hit = Space.Physics.RaycastSingle(Space.Host.ExecutingObject.WorldPosition, Space.Host.ExecutingObject.Forward, 500.0, mask) ``` * Lua ```lua local mask = LayerMask.New("Avatars"); or local mask = LayerMask.New("Avatars", "Vehicles", "UI"); local hit = Space.Physics.RaycastSingle(Space.Host.ExecutingObject.WorldPosition, Space.Host.ExecutingObject.Forward, 500.0, mask) ``` #### Properties[​](#properties "Direct link to Properties") ##### Inverted[​](#inverted "Direct link to Inverted") bool **Inverted** `get` `set` *Is the mask exclusionary or not.* * Lua ```lua local mask = LayerMask.New("Avatars"); -- Now change it to be an exclusionary mask that gets everything EXCEPT Avatars.' mask.inverted = true; ``` ##### Layers[​](#layers "Direct link to Layers") string\[] **Layers** `get` `set` *The layer names represented in this layer mask* * Lua ```lua local mask = LayerMask.New("Avatars"); -- Get local layers = mask.Layers; -- Set local layers = {"Vehicles", "UI"}; mask.Layers = layers; ``` --- ### SMaterial #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function | | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | SMaterial **Instantiate**() | | void [**SetFloat** ](/scripting/client-scripting-api-reference/types/smaterial.md#setfloat)(string key, float value) | | float [**GetFloat** ](/scripting/client-scripting-api-reference/types/smaterial.md#getfloat)(string key) | | void [**SetColor** ](smaterial#setcolor)(string key, SColor color)
void [**SetColor** ](smaterial#setcolor)(string key, float r, float g, float b, float a) | | [SColor](/scripting/client-scripting-api-reference/types/scolor.md) [**GetColor** ](/scripting/client-scripting-api-reference/types/smaterial.md#getcolor)(string key) | | void [**SetColor32** ](/scripting/client-scripting-api-reference/types/smaterial.md#setcolor32)(string key, byte r, byte g, byte b, byte a) | | void [**SetInt** ](/scripting/client-scripting-api-reference/types/smaterial.md#setint)(string key, int value) | | int [**GetInt** ](/scripting/client-scripting-api-reference/types/smaterial.md#getint)(string key) | | void [**SetTexture** ](/scripting/client-scripting-api-reference/types/smaterial.md#settexture)(string key, SResource value) | | SResource [**GetTexture** ](/scripting/client-scripting-api-reference/types/smaterial.md#gettexture)(string key) | | void [**SetTextureOffset** ](/scripting/client-scripting-api-reference/types/smaterial.md#settextureoffset)(string key, float x, float y) | | void [**SetTextureScale** ](/scripting/client-scripting-api-reference/types/smaterial.md#settexturescale)(string key, float x, float y) | | void [**SetVector** ](/scripting/client-scripting-api-reference/types/smaterial.md#setvector)(string key, SVector value) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property | Description | | ----------------------------------------------------------------------------------------------------------- | ----------- | | string [**Name** ](/scripting/client-scripting-api-reference/types/smaterial.md#name)`get` `set` | | | string [**Shader** ](/scripting/client-scripting-api-reference/types/smaterial.md#shader)`get` | | | int [**RenderQueue** ](/scripting/client-scripting-api-reference/types/smaterial.md#renderqueue)`get` `set` | | #### Functions[​](#functions "Direct link to Functions") ##### Instantiate[​](#instantiate "Direct link to Instantiate") SMaterial **Instantiate**() *Return a new SMaterial from old.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local cube=Space.Host.ExecutingObject local cube2=cube.Children[1] local mat1=cube.Renderer.Material local newMat=mat1.Instantiate() newMat.SetColor("_Color",Color.Red) cube2.Renderer.Material=newMat --at this moment, cube2 will turn to red but cube will keep original color. ``` ##### SetFloat[​](#setfloat "Direct link to SetFloat") void **SetFloat** (string key, float value) *Sets a shader property to value* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua -- Let's set the Metallic property to 0.75: local obj = Space.Host.ExecutingObject; obj.Renderer.Material.SetFloat("_Metallic", 0.75); ``` ##### GetFloat[​](#getfloat "Direct link to GetFloat") float **GetFloat** (string key) *Gets the current value of a shader property.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua -- Let's find out the current Glosiness level local obj = Space.Host.ExecutingObject; Space.Log(obj.Renderer.Material.GetFloat("_Glossiness")); -- prints "0.5" (by default) to the console. ``` ##### SetColor[​](#setcolor "Direct link to SetColor") void **SetColor** (string key, SColor color)
void **SetColor** (string key, float r, float g, float b, float a) *Sets a shader colour* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua -- Let's change the Color to red: local obj = Space.Host.ExecutingObject; local newColor = Color.New(1, 0, 0, 1); obj.Renderer.Material.SetColor("_Color", newColor); ``` * Lua ```lua -- Let's change the Color to purple: local obj = Space.Host.ExecutingObject; obj.Renderer.Material.SetColor("_Color", 0.5,0,0.5,1); ``` ##### GetColor[​](#getcolor "Direct link to GetColor") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **GetColor** (string propertyName) Get a named color value. Many shaders use more than one color. Use GetColor to get the propertyName color. | Parameter | Type | Description | | ------------ | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | propertyName | string | Common color names used by Unity's builtin shaders: "\_Color" is the main color of a material."\_SpecColor" is the specular color of a material (used in specular/glossy/vertexlit shaders)."\_EmissionColor" is the emissive color of a material (used in vertexlit shaders). "\_ReflectColor" is the reflection color of the material (used in reflective shaders). | * Lua ```lua Space.Host.ExecutingObject.Renderer.Material.GetColor("_Color") ``` ##### SetColor32[​](#setcolor32 "Direct link to SetColor32") void **SetColor32** (string key, byte r, byte g, byte b, byte a) *Sets a shader colour to value (32-bit, 0..255 values)* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua -- Let's change the Color to light blue: local obj = Space.Host.ExecutingObject; obj.Renderer.Material.SetColor32("_Color", 53,172,232,255); ``` ##### SetInt[​](#setint "Direct link to SetInt") void **SetInt** (string key, int value) *Sets a shader property to value. This can be a convenient way to work with Boolean values.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua -- For example, let's disable Specular Highlights (enabled by default in the Standard shader): local obj = Space.Host.ExecutingObject; obj.Renderer.Material.SetInt("_SpecularHighlights", 0); ``` ##### GetInt[​](#getint "Direct link to GetInt") int **GetInt** (string key) *Gets the current value of a shader property. This can be a convenient way to work with Boolean values.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua -- Let's find out if the Reflections property is enabled: local obj = Space.Host.ExecutingObject; Space.Log(obj.Renderer.Material.GetInt("_GlossyReflections")); -- prints "1" (by default) to the console, which means that the Reflections property is indeed enabled. ``` ##### SetTexture[​](#settexture "Direct link to SetTexture") void **SetTexture** (string key, SResource value) *Sets a object's specified texture map (specified in parameter 1) to the texture provided as a resource in parameter #2. The example script must be in a object with a '\_MainTex' map, and that object should be set as a resource on the scripting runtime. Additionally, that object should be called 'dispobj'.* *note also that this function can be used to set any of the texture maps by varying the value of the first parameter accordingly.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua function hithere() image = "mrlee.jpg" server = "https://middleware.systems/" obj = Space.Host.GetReference("dispobj") resrc = Space.WebServices.GetImage(server .. image) obj.Renderer.Material.SetTexture("_MainTex", resrc) end ``` ##### GetTexture[​](#gettexture "Direct link to GetTexture") SResource **GetTexture** (string propertyName) *Get a named texture. Many shaders use more than one texture. Use GetTexture to get the propertyName texture.* | Parameter | Type | Description | | ------------ | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | | propertyName | string | Common texture names used by Unity's builtin shaders:"\_MainTex" is the main diffuse texture."\_BumpMap" is the normal map. "\_Cube" is the reflection cubemap. | * Lua ```lua textureResource = Space.Host.ExecutingObject.Renderer.Material.GetTexture("_MainTex") ``` ##### SetTextureOffset[​](#settextureoffset "Direct link to SetTextureOffset") void **SetTextureOffset** (string key, float x, float y) *Sets a texture offset to a value.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Renderer.Material.SetTextureOffset("_MainTex", 0, 1) ``` ##### SetTextureScale[​](#settexturescale "Direct link to SetTextureScale") void **SetTextureScale** (string key, float x, float y) *Sets a texture scale to a value.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Renderer.Material.SetTextureScale("_MainTex", 0, 1) ``` ##### SetVector[​](#setvector "Direct link to SetVector") void **SetVector** (string key, SVector value) *Sets a shader property to value* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Host.ExecutingObject.Renderer.Material.SetTexture("_APropertyName", Vector.New(0,1,0)) ``` #### Properties[​](#properties "Direct link to Properties") ##### Name[​](#name "Direct link to Name") string **Name** `get` `set` *Return a new SMaterial from old.* * Lua ```lua local cube=Space.Host.ExecutingObject local mat=cube.Renderer.Material Space.Log(mat.Name) ``` ##### Shader[​](#shader "Direct link to Shader") string **Shader** `get` *Return the shader name of current SMaterial.* * Lua ```lua local cube=Space.Host.ExecutingObject local mat=cube.Renderer.Material Space.Log(mat.Shader) ``` ##### RenderQueue[​](#renderqueue "Direct link to RenderQueue") int **RenderQueue** `get` `set` *Render queue of this material.* *By default materials use render queue of the shader it uses. You can override the render queue used using this variable. Note that if a shader on the material is changed, the render queue resets to that of the shader itself.* *Render queue value should be in \[0..5000] range to work properly; or -1 to use the render queue from the shader.* * Lua ```lua RenderQueue = Space.Host.ExecutingObject.Renderer.Material.RenderQueue ``` --- ### SMath #### Index[​](#index "Direct link to Index") ##### Static Functions Index[​](#static-functions-index "Direct link to Static Functions Index") | Function Name | | ------------------------------------------------------------------------------------------------------------------------------------------------------- | | static float [**Random** ](/scripting/client-scripting-api-reference/types/smath.md#random)() | | static float [**RandomRange** ](/scripting/client-scripting-api-reference/types/smath.md#randomrange)(float min, float max) | | static int [**RandomInteger** ](/scripting/client-scripting-api-reference/types/smath.md#randominteger)(int min, int max) | | static float [**Abs** ](smath#abs)(float v)
static int [**Abs** ](smath#abs)(int v) | | static float [**Acos** ](/scripting/client-scripting-api-reference/types/smath.md#acos)(float v) | | static bool [**Approximately** ](/scripting/client-scripting-api-reference/types/smath.md#approximately)(float a, float b) | | static float [**Asin** ](/scripting/client-scripting-api-reference/types/smath.md#asin)(float v) | | static float [**Atan** ](/scripting/client-scripting-api-reference/types/smath.md#atan)(float v) | | static float [**Atan2** ](/scripting/client-scripting-api-reference/types/smath.md#atan2)(float y, float x) | | static int [**Ceil** ](/scripting/client-scripting-api-reference/types/smath.md#ceil)(float v) | | static float [**Clamp** ](/scripting/client-scripting-api-reference/types/smath.md#clamp)(float v, float min, float max) | | static float [**Clamp01** ](/scripting/client-scripting-api-reference/types/smath.md#clamp01)(float v) | | static int [**ClosestPowerOfTwo** ](/scripting/client-scripting-api-reference/types/smath.md#closestpoweroftwo)(int v) | | static float [**Cos** ](/scripting/client-scripting-api-reference/types/smath.md#cos)(float v) | | static float [**DeltaAngle** ](/scripting/client-scripting-api-reference/types/smath.md#deltaangle)(float current, float target) | | static float [**Exp** ](/scripting/client-scripting-api-reference/types/smath.md#exp)(float v) | | static int [**Floor** ](/scripting/client-scripting-api-reference/types/smath.md#floor)(float v) | | static float [**GammaToLinearSpace** ](/scripting/client-scripting-api-reference/types/smath.md#gammatolinearspace)(float v) | | static float [**InverseLerp** ](/scripting/client-scripting-api-reference/types/smath.md#inverselerp)(float a, float b, float value) | | static bool [**IsPowerOfTwo** ](/scripting/client-scripting-api-reference/types/smath.md#ispoweroftwo)(int v) | | static float [**Lerp** ](/scripting/client-scripting-api-reference/types/smath.md#lerp)(float a, float b, float v) | | static float [**LerpAngle** ](/scripting/client-scripting-api-reference/types/smath.md#lerpangle)(float a, float b, float v) | | static float [**LerpUnclamped** ](/scripting/client-scripting-api-reference/types/smath.md#lerpunclamped)(float a, float b, float v) | | static float [**LinearToGammaSpace** ](/scripting/client-scripting-api-reference/types/smath.md#lineartogammaspace)(float v) | | static float [**Log** ](smath#log)(float v)
static float [Log ](smath#log)(float v, float p) | | static float [**Log10** ](/scripting/client-scripting-api-reference/types/smath.md#log10)(float v) | | static float [**Max** ](/scripting/client-scripting-api-reference/types/smath.md#max)(float a, float b) | | static float [**Min** ](/scripting/client-scripting-api-reference/types/smath.md#min)(float a, float b) | | static float [**MoveTowards** ](/scripting/client-scripting-api-reference/types/smath.md#movetowards)(float value, float target, float delta) | | static float [**MoveTowardsAngle** ](/scripting/client-scripting-api-reference/types/smath.md#movetowardsangle)(float value, float target, float delta) | | static int [**NextPowerOfTwo** ](/scripting/client-scripting-api-reference/types/smath.md#nextpoweroftwo)(int v) | | static float [**PerlinNoise** ](/scripting/client-scripting-api-reference/types/smath.md#perlinnoise)(float x, float y) | | static float [**PingPong** ](/scripting/client-scripting-api-reference/types/smath.md#pingpong)(float t, float length) | | static float [**Pow** ](/scripting/client-scripting-api-reference/types/smath.md#pow)(float value, float pow) | | static float [**Repeat** ](/scripting/client-scripting-api-reference/types/smath.md#repeat)(float value, float length) | | static int [**Round** ](/scripting/client-scripting-api-reference/types/smath.md#round)(float value) | | static float [**Sign** ](/scripting/client-scripting-api-reference/types/smath.md#sign)(float value) | | static float [**Sin** ](/scripting/client-scripting-api-reference/types/smath.md#sin)(float value) | | static float [**SmoothStep** ](/scripting/client-scripting-api-reference/types/smath.md#smoothstep)(float from, float to, float t) | | static float [**Sqrt** ](/scripting/client-scripting-api-reference/types/smath.md#sqrt)(float value) | | static float [**Tan** ](/scripting/client-scripting-api-reference/types/smath.md#tan)(float value) | ##### Static Attributes Index[​](#static-attributes-index "Direct link to Static Attributes Index") | Property Name | | --------------------------------------------------------------------------------------------------- | | static readonly float [**Pi**](/scripting/client-scripting-api-reference/types/smath.md#pi)\*\*\*\* | #### Static Functions[​](#static-functions "Direct link to Static Functions") ##### Random[​](#random "Direct link to Random") static float **Random** () *Returns a random float between 0 and 1 (inclusive)* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local randomNumber = Space.Math.Random(); Space.Log(randomNumber); -- prints 0.689094245433807 ``` ##### RandomRange[​](#randomrange "Direct link to RandomRange") static float **RandomRange** (float min, float max) *Returns a random float between min and max (inclusive)* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local min = 100.0; local max = 500.0; local randomNumber = Space.Math.RandomRange(min, max ); Space.Log(randomNumber); -- prints 0206.659149169922 ``` ##### RandomInteger[​](#randominteger "Direct link to RandomInteger") static int **RandomInteger** (int min, int max) *Returns a random float between min (inclusive) and max (exclusive)* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local min = 50; local max = 75; local randomInteger = Space.Math.RandomInteger(min, max); Space.Log(randomInteger); -- prints 52 ``` ##### Abs[​](#abs "Direct link to Abs") static float **Abs** (float v)
static int **Abs** (int v) *Returns the absolute value of 'val'* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local value = -4.2 local absoluteNum = Space.Math.Abs(value); Space.Log(absoluteNum); -- prints 4 [BUG] should be 4.2 ``` ##### Acos[​](#acos "Direct link to Acos") static float **Acos** (float v) *Returns the arc cosine value of 'val'* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local value = 0.5; local arcCosine = Space.Math.Acos(value); Space.Log(arcCosine); -- prints 1.04719758033752 (radians) which is 60 degrees ``` ##### Approximately[​](#approximately "Direct link to Approximately") static bool **Approximately** (float a, float b) *True if the difference between a and b is less than epsilon* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local a = 5.0; local b = 5; local approx1 = Space.Math.Approximately(a, b); Space.Log(approx1); -- prints true local a = 5.01; local b = 5.0; local approx2 = Space.Math.Approximately(a, b); Space.Log(approx2); -- prints false local a = 5.01; local b = 5.0; local approx3 = Space.Math.Approximately(a, b); Space.Log(approx3); -- prints false ``` ##### Asin[​](#asin "Direct link to Asin") static float **Asin** (float v) *Returns the arc sine value of 'val'* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local value = 0.5; local arcSine = Space.Math.Asin(value); Space.Log(arcSine); -- prints 0.523598790168762 (radians) which is 30 degrees ``` ##### Atan[​](#atan "Direct link to Atan") static float **Atan** (float v) *Returns the arc tangent value of 'val'* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local value = 1.732050808; local arcTangent = Space.Math.Atan(value); Space.Log(arcTangent); -- prints 1.04719758033752 (radians) which is 60 degrees ``` ##### Atan2[​](#atan2 "Direct link to Atan2") static float **Atan2** (float y, float x) *Returns the arc tangent of y/x* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local x = 0.5; local y = 0.5; local arcTangent = Space.Math.Atan2(y, x); Space.Log(arcTangent); -- prints 0.785398185253143 ``` ##### Ceil[​](#ceil "Direct link to Ceil") static int **Ceil** (float v) *Returns the ceil value of 'val' as an integer* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Log(Space.Math.Ceil(4.0)); -- prints 4 Space.Log(Space.Math.Ceil(4.2)); -- prints 5 Space.Log(Space.Math.Ceil(-4.2)); -- prints -4 ``` ##### Clamp[​](#clamp "Direct link to Clamp") static float **Clamp** (float v, float min, float max) *Clamps val between min and max, and returns the result* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local value = 100.0; local min = 20.0; local max = 82.0; local clampedValue = Space.Math.Clamp(value, min, max); Space.Log(clampedValue); -- prints 82 ``` ##### Clamp01[​](#clamp01 "Direct link to Clamp01") static float **Clamp01** (float v) *Clamps val between 0 and 1, and returns the result* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local value = -1.0; local clampedValue = Space.Math.Clamp01(value); Space.Log(clampedValue); -- prints 0 ``` ##### ClosestPowerOfTwo[​](#closestpoweroftwo "Direct link to ClosestPowerOfTwo") static int **ClosestPowerOfTwo** (int v) *Returns the closest power of two to val* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local value = 33; local powerOfTwo = Space.Math.ClosestPowerOfTwo(value); Space.Log(powerOfTwo); -- prints 32 ``` ##### Cos[​](#cos "Direct link to Cos") static float **Cos** (float v) *Returns the cosine of val* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local angle = 1.04719758033752; -- converts to 60 degrees local cosine = Space.Math.Cos(angle); Space.Log(cosine); -- prints 0.499999970197678 local angle2 = Space.Math.Pi/3; -- converts to 60 degrees local cosine2 = Space.Math.Cos(angle2); Space.Log(cosine2); -- prints 0.499999970197678 ``` ##### DeltaAngle[​](#deltaangle "Direct link to DeltaAngle") static float **DeltaAngle** (float current, float target) *Returns the difference in degrees between two values (e.g. 350' and 17' returns 27')* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Log(Space.Math.DeltaAngle(350.0, 17.0)); -- prints 27 ``` ##### Exp[​](#exp "Direct link to Exp") static float **Exp** (float v) *Returns e raised to val power.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Log(Space.Math.Exp(3.0)); -- prints 20.0855369567871 ``` ##### Floor[​](#floor "Direct link to Floor") static int **Floor** (float v) *Returns floor of val, converted to an int* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Log(Space.Math.Floor(4.0)); -- prints 4 Space.Log(Space.Math.Floor(4.2)); -- prints 4 Space.Log(Space.Math.Floor(-4.2)); -- prints -5 ``` ##### GammaToLinearSpace[​](#gammatolinearspace "Direct link to GammaToLinearSpace") static float **GammaToLinearSpace** (float v) *Converts a colour value from Gamma to Linear Space (Pow 2.2)* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Log(Space.Math.GammaToLinearSpace(0.5)); -- prints 0.214041143655777 ``` ##### InverseLerp[​](#inverselerp "Direct link to InverseLerp") static float **InverseLerp** (float a, float b, float value) *Returns the percentage between a and b that 'val' is on a line (opposite of Lerp)* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local sliderStart = 0.0; local sliderStop = 100.0; local currentSliderPos = 75.0; local percentage = Space.Math.InverseLerp(sliderStart, sliderStop, currentSliderPos); Space.Log(percentage); -- prints 0.75 ``` ##### IsPowerOfTwo[​](#ispoweroftwo "Direct link to IsPowerOfTwo") static bool **IsPowerOfTwo** (int v) *Returns true if val is a power of two* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Log(Space.Math.IsPowerOfTwo(55)); -- prints False Space.Log(Space.Math.IsPowerOfTwo(32)); -- prints True ``` ##### Lerp[​](#lerp "Direct link to Lerp") static float **Lerp** (float a, float b, float v) *Interpolates between 'a' and 'b' based on 'val', assuming 'val' is between 0 and 1* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local sliderStart = 0.0; local sliderStop = 100.0; local percentage = 0.75; local currentSliderPos = Space.Math.Lerp(sliderStart, sliderStop, percentage); Space.Log(currentSliderPos); -- prints 75 ``` ##### LerpAngle[​](#lerpangle "Direct link to LerpAngle") static float **LerpAngle** (float a, float b, float v) *Interpolates between angles 'a' and 'b' based on 'val', assuming 'val' is between 0 and 1* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local sliderStartAngle = 0.0; local sliderStopAngle = Space.Math.Pi;-- 180 degrees local percentage = 0.50; local currentSliderPos = Space.Math.LerpAngle(sliderStartAngle, sliderStopAngle, percentage); Space.Log(currentSliderPos); -- prints 1.57079637050629 (90 degrees) ``` ##### LerpUnclamped[​](#lerpunclamped "Direct link to LerpUnclamped") static float **LerpUnclamped** (float a, float b, float v) *Interpolates between 'a' and 'b' based on 'val', assuming 'val' is between 0 and 1, but unbounded (allowing higher/lower values)* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local sliderStart = 0.0; local sliderStop = 100.0; local percentage = 2.0; local currentSliderPos = Space.Math.LerpUnclamped(sliderStart, sliderStop, percentage); Space.Log(currentSliderPos); -- prints 200 ``` ##### LinearToGammaSpace[​](#lineartogammaspace "Direct link to LinearToGammaSpace") static float **LinearToGammaSpace** (float v) *Converts a colour value from Linear to Gamma Space (Pow 1/2.2)* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Log(Space.Math.LinearToGammaSpace(0.214041143655777)); -- prints 0.5 ``` ##### Log[​](#log "Direct link to Log") static float **Log** (float v)
static float **Log** (float v, float p) *Returns the natural logarithm for 'val'* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Log(Space.Math.Log(30.0)); -- prints 3.40119743347168 Space.Log(Space.Math.Log(4.0, 2.0)); -- prints 2 ``` ##### Log10[​](#log10 "Direct link to Log10") static float **Log10** (float v) *Returns the Log10 value for 'val'* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Log(Space.Math.Log10(100.0)); -- prints 2 ``` ##### Max[​](#max "Direct link to Max") static float **Max** (float a, float b) *Returns higher of 'a' or 'b'* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Log(Space.Math.Max(20.0, 100.0)); -- prints 100 ``` ##### Min[​](#min "Direct link to Min") static float **Min** (float a, float b) *Returns lower of 'a' or 'b'* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Log(Space.Math.Min(20.0, 100.0)); -- prints 20 ``` ##### MoveTowards[​](#movetowards "Direct link to MoveTowards") static float **MoveTowards** (float value, float target, float delta) *Move value to target, but by no more than delta* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local sliderStart = 5.0; local sliderStop = 10.0; local deltaChange = 1.0; local currentSliderPos = Space.Math.MoveTowards(sliderStart, sliderStop, deltaChange); Space.Log(currentSliderPos); -- prints 6 (moves forward 1) local sliderStart = 5.0; local sliderStop = 10.0; local deltaChange = 7.0; local currentSliderPos = Space.Math.MoveTowards(sliderStart, sliderStop, deltaChange); Space.Log(currentSliderPos); -- prints 10 (caps out at at the target value) -- NOTE: Use negative delta to move away from target. ``` ##### MoveTowardsAngle[​](#movetowardsangle "Direct link to MoveTowardsAngle") static float **MoveTowardsAngle** (float value, float target, float delta) *Move angle value to target, but by no more than delta* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local sliderStartAngle = Space.Math.Pi/2; -- 90 degrees local sliderStopAngle = Space.Math.Pi; -- 180 degrees local deltaChange = Space.Math.Pi/6; -- 30 degrees local currentSliderPos = Space.Math.MoveTowardsAngle(sliderStartAngle, sliderStopAngle, deltaChange); Space.Log(currentSliderPos); -- prints 2.09439516067505 (moves forward 30 degrees to 120 degrees) -- NOTE: Add 180 degrees (Space.Math.Pi) to move away from target. ``` ##### NextPowerOfTwo[​](#nextpoweroftwo "Direct link to NextPowerOfTwo") static int **NextPowerOfTwo** (int v) *Return the next power of two larger or equal to val* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Log(Space.Math.NextPowerOfTwo(16)); -- prints 16 Space.Log(Space.Math.NextPowerOfTwo(17)); -- prints 32 ``` ##### PerlinNoise[​](#perlinnoise "Direct link to PerlinNoise") static float **PerlinNoise** (float x, float y) *Return 2D Perlin noise for coordinates x and y* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua -- Lua Translation of Unity C# Documentation local ball = Space.Host.ExecutingObject; ball.SubscribeToEvents(); -- animates this object to move upwards on the y axis with slight random movement local animateBall = function() local heightScale = 0.1; -- controls speed of movement local xScale = 1.0; -- shifts x position on perlin noise plane local height = heightScale * Space.Math.PerlinNoise(Space.Time * xScale, 0.0); local pos = ball.LocalPosition; pos.y = pos.y + height; ball.LocalPosition = pos; Space.Log(pos.y); end ball.OnUpdate(animateBall); -- NOTE: If you need a guaranteed range of [0,1], make sure to clamp the value with Space.Math.Clamp01. ``` ##### PingPong[​](#pingpong "Direct link to PingPong") static float **PingPong** (float t, float length) *Return a value between 0 and length that oscillates upwards and back based on the position of 'val'* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua --[[ In this example, if you traced the output of Space.Math.PingPong(value, length), the return values would cycle forward through the range [0,5] then cycle backwards through the range [5,0] in order. --]] local ball = Space.Host.ExecutingObject; local originalPos = ball.LocalPosition; ball.SubscribeToEvents(); -- The ball object oscillates back and forth on the x-axis. local animateBall = function() local value = Space.Time; local length = 5.0; local newPos = Vector.New(Space.Math.PingPong(value, length) + originalPos.x, originalPos.y, originalPos.z); ball.LocalPosition = newPos; end ball.OnUpdate(animateBall); ``` ##### Pow[​](#pow "Direct link to Pow") static float **Pow** (float value, float pow) *Return x raised to y power* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Log(Space.Math.Pow(2, 4)); -- prints 16 ``` ##### Repeat[​](#repeat "Direct link to Repeat") static float **Repeat** (float value, float length) *Return a value between 0 and length that returns to 0 after exceeding length based on 'val'* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua --[[ In this example, if you traced the output of Space.Math.Repeat(value, length), the return values would cycle forward through the range [0,5]. The cycle is repeated again from 0.--]] local ball = Space.Host.ExecutingObject; local originalPos = ball.LocalPosition; ball.SubscribeToEvents(); -- The ball object moves forward on the x-axis. -- Then, it repeats the same motion again from the beginning. local animateBall = function() local value = Space.Time; local length = 5.0; local newPos = Vector.New(Space.Math.Repeat(value, length) + originalPos.x, originalPos.y, originalPos.z); ball.LocalPosition = newPos; end ball.OnUpdate(animateBall); ``` ##### Round[​](#round "Direct link to Round") static int **Round** (float value) *Returns the nearest integer value to val* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Log(Space.Math.Round(4.0)); -- prints 4 Space.Log(Space.Math.Round(4.2)); -- prints 4 Space.Log(Space.Math.Round(4.5)); -- prints 4 Space.Log(Space.Math.Round(4.55)); -- prints 5 Space.Log(Space.Math.Round(4.8)); -- prints 5 Space.Log(Space.Math.Round(-4.2)); -- prints -4 Space.Log(Space.Math.Round(-4.8)); -- prints -5 ``` ##### Sign[​](#sign "Direct link to Sign") static float **Sign** (float value) *Returns either 1 or -1 based on the sign of 'val'* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Log(Space.Math.Sign(4.2)); -- prints 1 Space.Log(Space.Math.Sign(-4.2)); -- prints -1 ``` ##### Sin[​](#sin "Direct link to Sin") static float **Sin** (float value) *Returns the sine of val* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local angle = 1.04719758033752; -- converts to 60 degrees local sine = Space.Math.Sin(angle); Space.Log(sine); -- prints 0.866025447845459 local angle2 = Space.Math.Pi/3; -- converts to 60 degrees local sine2 = Space.Math.Sin(angle2); Space.Log(sine2); -- prints 0.866025447845459 ``` ##### SmoothStep[​](#smoothstep "Direct link to SmoothStep") static float **SmoothStep** (float from, float to, float t) *Similar to Lerp but moves slowly closer to the edges ('Spherical Lerp')* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua -- Lua Translation of Unity C# Documentation --[[ In this example, Space.Math.SmoothStep(min, max, time) returns values in the range [1,10] in order. As values approach 10, the interpolation slows down. --]] local ball = Space.Host.ExecutingObject; local originalPos = ball.LocalPosition; local min = 1.0; local max = 10.0; local duration = 5.0; --lower value to speed up; raise to slow down local startTime; ball.SubscribeToEvents(); local initStartTime = function() startTime = Space.Time; end -- The ball jumps to min + originalPos, then it moves towards -- max + originalPos while slowing down at the end. local animateBall = function() local time = (Space.Time - startTime) / duration; local newPos = Vector.New(Space.Math.SmoothStep(min, max, time) + originalPos.x, originalPos.y, originalPos.z); ball.LocalPosition = newPos; end ball.OnStart(initStartTime); ball.OnUpdate(animateBall); ``` ##### Sqrt[​](#sqrt "Direct link to Sqrt") static float **Sqrt** (float value) *Returns the square root of val* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Log(Space.Math.Sqrt(16)); -- prints 4 Space.Log(Space.Math.Sqrt(-16)); -- prints NaN ``` ##### Tan[​](#tan "Direct link to Tan") static float **Tan** (float value) *Returns the tangent value of 'val'* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local angle = 1.04719758033752; -- converts to 60 degrees local tangent = Space.Math.Tan(angle); Space.Log(tangent); -- prints 1.73205089569092 local angle2 = Space.Math.Pi/3; -- converts to 60 degrees local tangent2 = Space.Math.Tan(angle2); Space.Log(tangent2); -- prints 1.73205089569092 ``` * Lua ```lua local angle = 1.04719758033752; -- converts to 60 degrees local tangent = Space.Math.Tan(angle); Space.Log(tangent); -- prints 1.73205089569092 local angle2 = Space.Math.Pi/3; -- converts to 60 degrees local tangent2 = Space.Math.Tan(angle2); Space.Log(tangent2); -- prints 1.73205089569092 ``` * Lua ```lua local angle = 1.04719758033752; -- converts to 60 degrees local tangent = Space.Math.Tan(angle); Space.Log(tangent); -- prints 1.73205089569092 local angle2 = Space.Math.Pi/3; -- converts to 60 degrees local tangent2 = Space.Math.Tan(angle2); Space.Log(tangent2); -- prints 1.73205089569092 ``` #### Static Attributes[​](#static-attributes "Direct link to Static Attributes") ##### Pi[​](#pi "Direct link to Pi") static readonly float **Pi** = 3.14159265358979f *Returns the constant value of Ξ .* * Lua ```lua pi = Space.Math.Pi ``` --- ### SMusicDirectory #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function | | ----------------------------------------------------------------------------------------------------------------------------------------- | | void [**GetTop100** ](/scripting/client-scripting-api-reference/types/smusicdirectory.md#gettop100)(Closure onLoad) | | void [**GetGenreList** ](/scripting/client-scripting-api-reference/types/smusicdirectory.md#getgenrelist)(Closure onLoad, int parentId=0) | | void [**SearchByGenre** ](/scripting/client-scripting-api-reference/types/smusicdirectory.md#searchbygenre)(SGenre genre, Closure onLoad) | | void [**SearchByText** ](/scripting/client-scripting-api-reference/types/smusicdirectory.md#searchbytext)(string search, Closure onLoad) | #### Functions[​](#functions "Direct link to Functions") ##### GetTop100[​](#gettop100 "Direct link to GetTop100") void **GetTop100** (Closure onLoad) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` ##### GetGenreList[​](#getgenrelist "Direct link to GetGenreList") void **GetGenreList** (Closure onLoad, int parentId=0) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` ##### SearchByGenre[​](#searchbygenre "Direct link to SearchByGenre") void **SearchByGenre** ([SGenre](/scripting/client-scripting-api-reference/types/sgenre.md) genre, Closure onLoad) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` ##### SearchByText[​](#searchbytext "Direct link to SearchByText") void **SearchByText** (string search, Closure onLoad) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` --- ### SMusicStation #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function | | ------------------------------------------------------------------------------------------------------------ | | override string [**ToString** ](/scripting/client-scripting-api-reference/types/smusicstation.md#tostring)() | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property | | -------------------------------------------------------------------------------------------------------- | | string [**Name** ](/scripting/client-scripting-api-reference/types/smusicstation.md#name)`get` `set` | | string [**Mt**](/scripting/client-scripting-api-reference/types/smusicstation.md#mt) `get` `set` | | string [**Id**](/scripting/client-scripting-api-reference/types/smusicstation.md#id) `get` `set` | | string [**Br**](/scripting/client-scripting-api-reference/types/smusicstation.md#br) `get` `set` | | string [**Genre**](/scripting/client-scripting-api-reference/types/smusicstation.md#genre) `get` `set` | | string [**Genre2** ](/scripting/client-scripting-api-reference/types/smusicstation.md#genre2)`get` `set` | | string [**Logo** ](/scripting/client-scripting-api-reference/types/smusicstation.md#logo)`get` `set` | | string [**Ct**](/scripting/client-scripting-api-reference/types/smusicstation.md#ct) `get` `set` | | string [**Lc**](/scripting/client-scripting-api-reference/types/smusicstation.md#lc) `get` `set` | #### Functions[​](#functions "Direct link to Functions") ##### ToString[​](#tostring "Direct link to ToString") override string **ToString** () *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` #### Properties[​](#properties "Direct link to Properties") ##### Name[​](#name "Direct link to Name") string **Name** `get` `set` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` ##### Mt[​](#mt "Direct link to Mt") string **Mt** `get` `set` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` ##### Id[​](#id "Direct link to Id") string **Id** `get` `set` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` ##### Br[​](#br "Direct link to Br") string **Br** `get` `set` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` ##### Genre[​](#genre "Direct link to Genre") string **Genre** `get` `set` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` ##### Genre2[​](#genre2 "Direct link to Genre2") string **Genre2** `get` `set` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` ##### Logo[​](#logo "Direct link to Logo") string **Logo** `get` `set` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` ##### Ct[​](#ct "Direct link to Ct") string **Ct** `get` `set` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` ##### Lc[​](#lc "Direct link to Lc") string **Lc** `get` `set` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` --- ### SMusicStationList #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property | | ----------------------------------------------------------------------------------------------------------------------------- | | STuneIn [**TuneIn** ](/scripting/client-scripting-api-reference/types/smusicstationlist.md#tunein)`get` `set` | | List< SMusicStation > [**Station** ](/scripting/client-scripting-api-reference/types/smusicstationlist.md#station)`get` `set` | #### Properties[​](#properties "Direct link to Properties") ##### TuneIn[​](#tunein "Direct link to TuneIn") [STuneIn](/scripting/client-scripting-api-reference/types/stunein.md) **TuneIn** `get` `set` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` ##### Station[​](#station "Direct link to Station") List< [SMusicStation](/scripting/client-scripting-api-reference/types/smusicstation.md) > **Station** `get` `set` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` --- ### SOutfit #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function | | ----------------------------------------------------------------------------------------------------------------- | | void [**GetPreview** ](/scripting/client-scripting-api-reference/types/soutfit.md#getpreview)(Closure onComplete) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property | | ---------------------------------------------------------------------------------------- | | int [**ID**](/scripting/client-scripting-api-reference/types/soutfit.md#id) `get` | | string [**Name** ](/scripting/client-scripting-api-reference/types/soutfit.md#name)`get` | #### Functions[​](#functions "Direct link to Functions") ##### GetPreview[​](#getpreview "Direct link to GetPreview") void **GetPreview** (Closure onComplete) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` #### Properties[​](#properties "Direct link to Properties") ##### ID[​](#id "Direct link to ID") int **ID** `get` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` ##### Name[​](#name "Direct link to Name") string **Name** `get` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` --- ### SParticle #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property | | --------------------------------------------------------------------------------------------------------------------------- | | SVector [**position** ](/scripting/client-scripting-api-reference/types/sparticle.md#position)`get` `set` | | SVector [**velocity** ](/scripting/client-scripting-api-reference/types/sparticle.md#velocity)`get` `set` | | SVector [**animatedVelocity** ](/scripting/client-scripting-api-reference/types/sparticle.md#animatedvelocity)`get` | | SVector [**totalVelocity** ](/scripting/client-scripting-api-reference/types/sparticle.md#totalvelocity)`get` | | float [**remainingLifetime** ](/scripting/client-scripting-api-reference/types/sparticle.md#remaininglifetime)`get` `set` | | float [**startLifetime** ](/scripting/client-scripting-api-reference/types/sparticle.md#startlifetime)`get` `set` | | SColor [**startColor** ](/scripting/client-scripting-api-reference/types/sparticle.md#startcolor)`get` `set` | | uint [**randomSeed** ](/scripting/client-scripting-api-reference/types/sparticle.md#randomseed)`get` `set` | | SVector [**axisOfRotation** ](/scripting/client-scripting-api-reference/types/sparticle.md#axisofrotation)`get` `set` | | float [**startSize** ](/scripting/client-scripting-api-reference/types/sparticle.md#startsize)`get` `set` | | SVector [**startSize3D** ](/scripting/client-scripting-api-reference/types/sparticle.md#startsize3d)`get` `set` | | float [**rotation** ](/scripting/client-scripting-api-reference/types/sparticle.md#rotation)`get` `set` | | SVector [**rotation3D** ](/scripting/client-scripting-api-reference/types/sparticle.md#rotation3d)`get` `set` | | float [**angularVelocity** ](/scripting/client-scripting-api-reference/types/sparticle.md#angularvelocity)`get` `set` | | SVector [**angularVelocity3D** ](/scripting/client-scripting-api-reference/types/sparticle.md#angularvelocity3d)`get` `set` | #### Properties[​](#properties "Direct link to Properties") ##### position[​](#position "Direct link to position") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **position** `get` `set` *The position of the particle.* * Lua ```lua this = Space.Host.ExecutingObject OnParticleTrigger = function(GameObject) ParticlesArray = this.ParticleSystem.GetTriggerParticles(0) FirstParticle = ParticlesArray[1] position = FirstParticle.position end this.SubscribeToEvents() this.OnParticleTrigger(OnParticleTrigger) ``` * Lua ```lua example 2 ``` ##### velocity[​](#velocity "Direct link to velocity") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **velocity** `get` `set` *The velocity of the particle.* * Lua ```lua this = Space.Host.ExecutingObject OnParticleTrigger = function(GameObject) ParticlesArray = this.ParticleSystem.GetTriggerParticles(0) FirstParticle = ParticlesArray[1] velocity= FirstParticle.velocity end this.SubscribeToEvents() this.OnParticleTrigger(OnParticleTrigger) ``` ##### animatedVelocity[​](#animatedvelocity "Direct link to animatedVelocity") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **animatedVelocity** `get` *The animated velocity of the particle.* * Lua ```lua this = Space.Host.ExecutingObject OnParticleTrigger = function(GameObject) ParticlesArray = this.ParticleSystem.GetTriggerParticles(0) FirstParticle = ParticlesArray[1] animatedVelocity= FirstParticle.animatedVelocity end this.SubscribeToEvents() this.OnParticleTrigger(OnParticleTrigger) ``` * Lua ```lua example 2 ``` ##### totalVelocity[​](#totalvelocity "Direct link to totalVelocity") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **totalVelocity** `get` *The total velocity of the particle.* * Lua ```lua this = Space.Host.ExecutingObject OnParticleTrigger = function(GameObject) ParticlesArray = this.ParticleSystem.GetTriggerParticles(0) FirstParticle = ParticlesArray[1] totalVelocity= FirstParticle.totalVelocity end this.SubscribeToEvents() this.OnParticleTrigger(OnParticleTrigger) ``` ##### remainingLifetime[​](#remaininglifetime "Direct link to remainingLifetime") float **remainingLifetime** `get` `set` *The remaining lifetime of the particle.* * Lua ```lua this = Space.Host.ExecutingObject OnParticleTrigger = function(GameObject) ParticlesArray = this.ParticleSystem.GetTriggerParticles(0) FirstParticle = ParticlesArray[1] remainingLifetime= FirstParticle.remainingLifetime end this.SubscribeToEvents() this.OnParticleTrigger(OnParticleTrigger) ``` ##### startLifetime[​](#startlifetime "Direct link to startLifetime") float **startLifetime** `get` `set` *The starting lifetime of the particle.* * Lua ```lua this = Space.Host.ExecutingObject OnParticleTrigger = function(GameObject) ParticlesArray = this.ParticleSystem.GetTriggerParticles(0) FirstParticle = ParticlesArray[1] startLifetime= FirstParticle.startLifetime end this.SubscribeToEvents() this.OnParticleTrigger(OnParticleTrigger) ``` ##### startColor[​](#startcolor "Direct link to startColor") [SColor](/scripting/client-scripting-api-reference/types/scolor.md) **startColor** `get` `set` *The initial color of the particle. The current color of the particle is calculated procedurally based on this value and the active color modules.* * Lua ```lua this = Space.Host.ExecutingObject OnParticleTrigger = function(GameObject) ParticlesArray = this.ParticleSystem.GetTriggerParticles(0) FirstParticle = ParticlesArray[1] startColor= FirstParticle.startColor end this.SubscribeToEvents() this.OnParticleTrigger(OnParticleTrigger) ``` ##### randomSeed[​](#randomseed "Direct link to randomSeed") uint **randomSeed** `get` `set` *The random seed of the particle.* * Lua ```lua this = Space.Host.ExecutingObject OnParticleTrigger = function(GameObject) ParticlesArray = this.ParticleSystem.GetTriggerParticles(0) FirstParticle = ParticlesArray[1] randomSeed= FirstParticle.randomSeed end this.SubscribeToEvents() this.OnParticleTrigger(OnParticleTrigger) ``` ##### axisOfRotation[​](#axisofrotation "Direct link to axisOfRotation") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **axisOfRotation** `get` `set` *Mesh particles rotate around this axis.* * Lua ```lua this = Space.Host.ExecutingObject OnParticleTrigger = function(GameObject) ParticlesArray = this.ParticleSystem.GetTriggerParticles(0) FirstParticle = ParticlesArray[1] axisOfRotation= FirstParticle.axisOfRotation end this.SubscribeToEvents() this.OnParticleTrigger(OnParticleTrigger) ``` ##### startSize[​](#startsize "Direct link to startSize") float **startSize** `get` `set` *The initial size of the particle. The current size of the particle is calculated procedurally based on this value and the active size modules.* * Lua ```lua this = Space.Host.ExecutingObject OnParticleTrigger = function(GameObject) ParticlesArray = this.ParticleSystem.GetTriggerParticles(0) FirstParticle = ParticlesArray[1] startSize= FirstParticle.startSize end this.OnParticleTrigger(OnParticleTrigger) ``` ##### startSize3D[​](#startsize3d "Direct link to startSize3D") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **startSize3D** `get` `set` *The initial 3D size of the particle. The current size of the particle is calculated procedurally based on this value and the active size modules.* * Lua ```lua this = Space.Host.ExecutingObject OnParticleTrigger = function(GameObject) ParticlesArray = this.ParticleSystem.GetTriggerParticles(0) FirstParticle = ParticlesArray[1] startSize3D= FirstParticle.startSize3D end this.OnParticleTrigger(OnParticleTrigger) ``` ##### rotation[​](#rotation "Direct link to rotation") float **rotation** `get` `set` *The rotation of the particle.* * Lua ```lua this = Space.Host.ExecutingObject OnParticleTrigger = function(GameObject) ParticlesArray = this.ParticleSystem.GetTriggerParticles(0) FirstParticle = ParticlesArray[1] rotation= FirstParticle.rotation end this.OnParticleTrigger(OnParticleTrigger) ``` ##### rotation3D[​](#rotation3d "Direct link to rotation3D") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **rotation3D** `get` `set` *The 3D rotation of the particle.* * Lua this = Space.Host.ExecutingObject OnParticleTrigger = function(GameObject) ParticlesArray = this.ParticleSystem.GetTriggerParticles(0) FirstParticle = ParticlesArray\[1] rotation3D= FirstParticle.rotation3D end this.SubscribeToEvents() this.OnParticleTrigger(OnParticleTrigger) ````text
```lua example 2 ```` ##### angularVelocity[​](#angularvelocity "Direct link to angularVelocity") float **angularVelocity** `get` `set` *The angular velocity of the particle.* * Lua ```lua this = Space.Host.ExecutingObject OnParticleTrigger = function(GameObject) ParticlesArray = this.ParticleSystem.GetTriggerParticles(0) FirstParticle = ParticlesArray[1] angularVelocity= FirstParticle.angularVelocity end this.SubscribeToEvents() this.OnParticleTrigger(OnParticleTrigger) ``` ##### angularVelocity3D[​](#angularvelocity3d "Direct link to angularVelocity3D") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **angularVelocity3D** `get` `set` *The 3D angular velocity of the particle.* * Lua ```lua this = Space.Host.ExecutingObject OnParticleTrigger = function(GameObject) ParticlesArray = this.ParticleSystem.GetTriggerParticles(0) FirstParticle = ParticlesArray[1] angularVelocity3D= FirstParticle.angularVelocity3D end this.SubscribeToEvents() this.OnParticleTrigger(OnParticleTrigger) ``` --- ### SPhysicsHit #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property | | -------------------------------------------------------------------------------------------------------- | | SGameObject [**Object** ](/scripting/client-scripting-api-reference/types/sphysicshit.md#object)`get` | | SVector [**Position** ](/scripting/client-scripting-api-reference/types/sphysicshit.md#position)`get` | | SVector [**Normal** ](/scripting/client-scripting-api-reference/types/sphysicshit.md#normal)`get` | | SVector [**UV** ](/scripting/client-scripting-api-reference/types/sphysicshit.md#uv)`get` | | SVector [**UV2** ](/scripting/client-scripting-api-reference/types/sphysicshit.md#uv2)`get` | | float [**Distance** ](/scripting/client-scripting-api-reference/types/sphysicshit.md#distance)`get` | | bool [**ContainsHit** ](/scripting/client-scripting-api-reference/types/sphysicshit.md#containshit)`get` | #### Properties[​](#properties "Direct link to Properties") ##### Object[​](#object "Direct link to Object") [SGameObject ](/scripting/client-scripting-api-reference/types/sgameobject.md)**Object** `get` *Property Description* * Lua ```lua this = Space.Host.ExecutingObject hit = Space.Physics.RayCastSingle(this.WorldPosition,this.Forward,20) hitGameObject = hit.Object ``` * Lua ```lua example 2 ``` ##### Position[​](#position "Direct link to Position") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **Position** `get` *Where the physics hit occurred* * Lua ```lua this = Space.Host.ExecutingObject hit = Space.Physics.RayCastSingle(this.WorldPosition,this.Forward,20) hitPosition = hit.Position ``` ##### Normal[​](#normal "Direct link to Normal") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **Normal** `get` *The normal of the hit* * Lua ```lua this = Space.Host.ExecutingObject hit = Space.Physics.RayCastSingle(this.WorldPosition,this.Forward,20) hitNormal = hit.Normal ``` ##### UV[​](#uv "Direct link to UV") SVector **UV** `get` *The UV coordinates of where the hit occurred on a mesh.* danger This property will currently always return \[0,0] due to a current bug. * Lua ```lua this = Space.Host.ExecutingObject hit = Space.Physics.RayCastSingle(this.WorldPosition,this.Forward,20) hitUV = hit.UV ``` ##### UV2[​](#uv2 "Direct link to UV2") SVector **UV2** `get` *The UV2 coordinates of where the hit occurred on a mesh.* danger This property will currently always return \[0,0] due to a current bug. * Lua ```lua this = Space.Host.ExecutingObject hit = Space.Physics.RayCastSingle(this.WorldPosition,this.Forward,20) hitUV2 = hit.UV2 ``` ##### Distance[​](#distance "Direct link to Distance") float **Distance** `get` *How far down a ray or from the collider, the hit occurred* * Lua ```lua this = Space.Host.ExecutingObject hit = Space.Physics.RayCastSingle(this.WorldPosition,this.Forward,20) hitDistance = hit.Distance ``` ##### ContainsHit[​](#containshit "Direct link to ContainsHit") bool **ContainsHit** `get` *Whether it was a hit or not* * Lua ```lua this = Space.Host.ExecutingObject hit = Space.Physics.RayCastSingle(this.WorldPosition,this.Forward,20) hitContainsHit = hit.ContainsHit ``` --- ### SPublicRegion #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property | | -------------------------------------------------------------------------------------------------------------- | | int [**ID**](/scripting/client-scripting-api-reference/types/spublicregion.md#id) `get` | | int [**OwnerID** ](/scripting/client-scripting-api-reference/types/spublicregion.md#ownerid)`get` | | string [**Name** ](/scripting/client-scripting-api-reference/types/spublicregion.md#name)`get` | | string [**MapPath** ](/scripting/client-scripting-api-reference/types/spublicregion.md#mappath)`get` | | string [**PreviewPath** ](/scripting/client-scripting-api-reference/types/spublicregion.md#previewpath)`get` | | int [**RankingScore** ](/scripting/client-scripting-api-reference/types/spublicregion.md#rankingscore)`get` | | int [**MaxAvatars** ](/scripting/client-scripting-api-reference/types/spublicregion.md#maxavatars)`get` | | int [**FileSize** ](/scripting/client-scripting-api-reference/types/spublicregion.md#filesize)`get` | | int [**Memory** ](/scripting/client-scripting-api-reference/types/spublicregion.md#memory)`get` | | SLandmark\[] [**Landmarks** ](/scripting/client-scripting-api-reference/types/spublicregion.md#landmarks)`get` | | SSubRegion\[] [**Regions** ](/scripting/client-scripting-api-reference/types/spublicregion.md#regions)`get` | | string [**Description** ](/scripting/client-scripting-api-reference/types/spublicregion.md#description)`get` | | SAccessType [**Access** ](/scripting/client-scripting-api-reference/types/spublicregion.md#access)`get` | #### Properties[​](#properties "Direct link to Properties") ##### ID[​](#id "Direct link to ID") int **ID** `get` *The Region ID of this region* * Lua ```lua function GetUserRegionsComplete(SUserRegions) local r = SUserRegions.AvailableRegions[1] regionID = r.ID end Space.Grid.GetEnabledUserRegions(GetUserRegionsComplete) ``` ##### OwnerID[​](#ownerid "Direct link to OwnerID") int **OwnerID** `get` *The ID of the owner of this region* * Lua ```lua function GetUserRegionsComplete(SUserRegions) local r = SUserRegions.AvailableRegions[1] regionOwnerID = r.OwnerID end Space.Grid.GetEnabledUserRegions(GetUserRegionsComplete) ``` ##### Name[​](#name "Direct link to Name") string **Name** `get` *The Name of this region* * Lua ```lua function GetUserRegionsComplete(SUserRegions) local r = SUserRegions.AvailableRegions[1] regionName = r.Name end Space.Grid.GetEnabledUserRegions(GetUserRegionsComplete) ``` ##### MapPath[​](#mappath "Direct link to MapPath") string **MapPath** `get` *Property Description* * Lua ```lua function GetUserRegionsComplete(SUserRegions) local r = SUserRegions.AvailableRegions[1] regionMapPath = r.MapPath end Space.Grid.GetEnabledUserRegions(GetUserRegionsComplete) ``` ##### PreviewPath[​](#previewpath "Direct link to PreviewPath") string **PreviewPath** `get` *Property Description* * Lua ```lua --Make's a UIText show the Preview Path of the user's first available region textObject = Space.Host.GetReference("TheTextReference") function GetUserRegionsComplete(SUserRegions) local r = SUserRegions.AvailableRegions[1] regionPreviewPath = r.PreviewPath end Space.Grid.GetEnabledUserRegions(GetUserRegionsComplete) ``` ##### RankingScore[​](#rankingscore "Direct link to RankingScore") int **RankingScore** `get` *The Ranking Score of the region.* * Lua ```lua function GetUserRegionsComplete(SUserRegions) local r = SUserRegions.AvailableRegions[1] regionRankingScore = r.RankingScore end Space.Grid.GetEnabledUserRegions(GetUserRegionsComplete) ``` ##### MaxAvatars[​](#maxavatars "Direct link to MaxAvatars") int **MaxAvatars** `get` *The max number of avatars this region can hold.* * Lua ```lua function GetUserRegionsComplete(SUserRegions) local r = SUserRegions.AvailableRegions[1] regionMaxAvatars = r.MaxAvatars end Space.Grid.GetEnabledUserRegions(GetUserRegionsComplete) ``` ##### FileSize[​](#filesize "Direct link to FileSize") int **FileSize** `get` *The current MBs the region is using.* * Lua ```lua function GetUserRegionsComplete(SUserRegions) local r = SUserRegions.AvailableRegions[1] regionFileSize = r.FileSize end Space.Grid.GetEnabledUserRegions(GetUserRegionsComplete) ``` ##### Memory[​](#memory "Direct link to Memory") int **Memory** `get` *Property Description* * Lua ```lua function GetUserRegionsComplete(SUserRegions) local r = SUserRegions.AvailableRegions[1] regionMemory = r.Memory end Space.Grid.GetEnabledUserRegions(GetUserRegionsComplete) ``` ##### Landmarks[​](#landmarks "Direct link to Landmarks") [SLandmark](/scripting/client-scripting-api-reference/types/slandmark.md)\[] **Landmarks** `get` *An array of Landmarks in the region.* * Lua \`\`\` function GetUserRegionsComplete(SUserRegions) local r = SUserRegions.AvailableRegions\[1] regionLandmarks = r.Landmarks end Space.Grid.GetEnabledUserRegions(GetUserRegionsComplete) \`\`\` ##### Regions[​](#regions "Direct link to Regions") [SSubRegion](/scripting/client-scripting-api-reference/types/ssubregion.md)\[] **Regions** `get` *Returns an array of* [*SSubRegion*](/scripting/client-scripting-api-reference/types/ssubregion.md) *in the region.* * Lua ```lua function GetUserRegionsComplete(SUserRegions) local r = SUserRegions.AvailableRegions[1] regionSubRegions = r.Regions end Space.Grid.GetEnabledUserRegions(GetUserRegionsComplete) ``` ##### Description[​](#description "Direct link to Description") string **Description** `get` *Returns the description of the region.* * Lua ```lua function GetUserRegionsComplete(SUserRegions) local r = SUserRegions.AvailableRegions[1] regionDescription = r.Description end Space.Grid.GetEnabledUserRegions(GetUserRegionsComplete) ``` ##### Access[​](#access "Direct link to Access") int **Access** `get` *The access type of the region (such as "Public" or "Approved only")*
*1=* Disabled, 2= FreeForall, 3= FriendsOnly, 4= ApprovedOnly, 5= GroupsOnly * Lua ```lua function GetUserRegionsComplete(SUserRegions) local r = SUserRegions.AvailableRegions[1] regionAccessType = r.Access end Space.Grid.GetEnabledUserRegions(GetUserRegionsComplete) ``` --- ### SQuaternion #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | string [**ToString** ](/scripting/client-scripting-api-reference/types/squaternion.md#tostring)() | | float [**Angle** ](/scripting/client-scripting-api-reference/types/squaternion.md#angle)(SQuaternion b) | | SQuaternion [**Lerp** ](/scripting/client-scripting-api-reference/types/squaternion.md#lerp)(SQuaternion b, float t) | | SQuaternion [**Slerp** ](/scripting/client-scripting-api-reference/types/squaternion.md#slerp)(SQuaternion b, float t) | | SQuaternion [**RotateTowards** ](/scripting/client-scripting-api-reference/types/squaternion.md#rotatetowards)(SQuaternion b, float delta) | | float [**Dot** ](/scripting/client-scripting-api-reference/types/squaternion.md#dot)(SQuaternion b) | | bool [**Equals** ](/scripting/client-scripting-api-reference/types/squaternion.md#equals)(SQuaternion other) | | | | **Static Functions** | | static SQuaternion [**New** ](/scripting/client-scripting-api-reference/types/squaternion.md#new)(float x, float y, float z, float w) | | static SQuaternion [**Euler** ](/scripting/client-scripting-api-reference/types/squaternion.md#euler)(float x, float y, float z) | | static SQuaternion [**AngleAxis** ](/scripting/client-scripting-api-reference/types/squaternion.md#angleaxis)(SVector axis, float angle) | | static SQuaternion [**LookRotation** ](squaternion#lookrotation)(SVector forward)
static SQuaternion [**LookRotation** ](squaternion#lookrotation)(SVector forward, SVector up) | | static SVector [**operator**](squaternion#operator) *(SQuaternion a, SVector b)*
*static SQuaternion* [***operator***](squaternion#operator) (SQuaternion a, SQuaternion b) | | static SQuaternion **FromToRotation** (SVector a, SVector b) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property | | ---------------------------------------------------------------------------------------------------------------- | | float [**X**](/scripting/client-scripting-api-reference/types/squaternion.md#x) `get` `set` | | float [**Y**](/scripting/client-scripting-api-reference/types/squaternion.md#y) `get` `set` | | float [**Z**](/scripting/client-scripting-api-reference/types/squaternion.md#z) `get` `set` | | float [**W**](/scripting/client-scripting-api-reference/types/squaternion.md#w) `get` `set` | | SVector [**EulerAngles** ](/scripting/client-scripting-api-reference/types/squaternion.md#eulerangles)`get` | | SQuaternion [**Inverse** ](/scripting/client-scripting-api-reference/types/squaternion.md#inverse)`get` | | | | **Static Properties** | | static SQuaternion [**Identity** ](/scripting/client-scripting-api-reference/types/squaternion.md#identity)`get` | #### Functions[​](#functions "Direct link to Functions") ##### ToString[​](#tostring "Direct link to ToString") string **ToString** () *Converts a quaternion to a human readable string* * Lua ```lua aQuaternion = Quaternion.New(0.0, 1.0, 0.0, 0.0) theString = aQuaternion.ToString() ``` ##### Angle[​](#angle "Direct link to Angle") float **Angle** (SQuaternion b) *Returns the angle between two quaternions* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local newQuat = Quaternion.New(0.0, 0.707, 0.0, 0.707); local otherQuat = Quaternion.New(0.0, 1.0, 0.0, 0.0); angle = newQuat.Angle(otherQuat); Space.Log(angle); -- prints 90.0173034667969 ``` ##### Lerp[​](#lerp "Direct link to Lerp") SQuaternion **Lerp** (SQuaternion b, float t) *Linearly interpolates between this and other quaternion, by factor t and returns the result* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua QuatA = Quaternion.New(0.0, 0.707, 0.0, 0.707) QuatB = Quaternion.New(0.0, 1.0, 0.0, 0.0) QuatLerpAB = QuatA.Lerp(QuatB, Space.Time * 0.1) ``` * Lua ```lua local cube = Space.Host.ExecutingObject local fromQuat = cube.LocalRotation local toQuat = Quaternion.New(0.0, 0.707, 0.0, 0.707) local speed = 0.1 -- The cube will rotate 90 degrees from current rotation by speed amount. local moveCube = function() cube.LocalRotation = fromQuat.Lerp(toQuat, Space.Time * speed); end cube.OnUpdate(moveCube) ``` ##### Slerp[​](#slerp "Direct link to Slerp") SQuaternion **Slerp** (SQuaternion b, float t) *Spherically interpolates between this and other quaternion, by factor t and returns the result* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua QuatA = Quaternion.New(0.0, 0.707, 0.0, 0.707) QuatB = Quaternion.New(0.0, 1.0, 0.0, 0.0) QuatLerpAB = QuatA.Slerp(QuatB, Space.Time * 0.1) ``` * Lua ```lua local cube = Space.Host.ExecutingObject; local fromQuat = cube.LocalRotation; local toQuat = Quaternion.New(0.0, 1.0, 0.0, 0.0); local speed = 0.1; -- The cube will rotate 180 degrees from current rotation by speed amount. local moveCube = function() cube.LocalRotation = fromQuat.Slerp(toQuat, Space.Time * speed) end cube.OnUpdate(moveCube) ``` ##### RotateTowards[​](#rotatetowards "Direct link to RotateTowards") SQuaternion **RotateTowards** (SQuaternion b, float delta) *Rotates this towards other, by no more than t degrees* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua QuatA = Quaternion.New(0.0, 0.707, 0.0, 0.707) QuatB = Quaternion.New(0.0, 1.0, 0.0, 0.0) ARotatedTowardB = QuatA.RotateTowards(QuatB, Space.Time * 0.1) ``` * Lua ```lua local cube = Space.Host.ExecutingObject local fromQuat = cube.LocalRotation local target = Quaternion.New(0.0, 0.707, 0.0, 0.707) local speed = 10.0 -- The cube will rotate 90 degrees from current rotation by step amount. local moveCube = function() local step = speed * Space.Time cube.LocalRotation = fromQuat.RotateTowards(target, step) end cube.OnUpdate(moveCube) ``` ##### Dot[​](#dot "Direct link to Dot") float **Dot** (SQuaternion b) *Returns the dot product of this and another quaternion* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local quat = Quaternion.New(0.0, 0.707, 0.0, 0.707); local quatOther = Quaternion.New(0.0, 0.0, 0.0, 1.0); Space.Log(quat.Dot(quatOther)); -- prints 0.707000017166138 ``` ##### Equals[​](#equals "Direct link to Equals") bool **Equals** (SQuaternion other) *Function Description* | Parameter | Type | Description | | --------- | ----------- | ------------------------------------------------ | | other | SQuaternion | The other Quaternion that we are comparing with. | * Lua ```lua QuatA = Quaternion.New(0.0, 0.707, 0.0, 0.707) QuatB = Quaternion.New(0.0, 1.0, 0.0, 0.0) isEqual = QuatA.Equals(QuatB) ``` ##### New[​](#new "Direct link to New") static SQuaternion **New** (float x, float y, float z, float w) *Creates a new Quaternion* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua newQuat = Quaternion.New(0.0, 0.707, 0.0, 0.707) ``` ##### Euler[​](#euler "Direct link to Euler") static SQuaternion **Euler** (float x, float y, float z) *Creates a quaternion using Euler angles.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua newQuat = Quaternion.Euler(0.0, 90.0, 0.0) ``` ##### AngleAxis[​](#angleaxis "Direct link to AngleAxis") static SQuaternion **AngleAxis** ([SVector](/scripting/client-scripting-api-reference/types/svector.md) axis, float angle) *Creates a quaternion from an Angle/Axis pair* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua newVector = Vector.New(0.0, 90.0, 0.0) newQuat = Quaternion.AngleAxis(newVector, 90.0) ``` ##### LookRotation[​](#lookrotation "Direct link to LookRotation") static SQuaternion **LookRotation** ([SVector](/scripting/client-scripting-api-reference/types/svector.md) forward)
static SQuaternion **LookRotation** ([SVector](/scripting/client-scripting-api-reference/types/svector.md) forward, [SVector](/scripting/client-scripting-api-reference/types/svector.md) up) *Creates a quaternion a forward vector; presuming up is (0,1,0)* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local newQuat = Quaternion.LookRotation(Vector.Forward); -- or local newQuat = Quaternion.LookRotation(Vector.Forward, Vector.Up); ``` ##### operator\*[​](#operator "Direct link to operator*") static [SVector](/scripting/client-scripting-api-reference/types/svector.md) **operator**\* (SQuaternion a, [SVector](/scripting/client-scripting-api-reference/types/svector.md) b)
static SQuaternion **operator**\* (SQuaternion a, SQuaternion b) *The result of using the \* operator.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua newQuat = Quaternion.New(0.0, 1.0, 0.0, 0.0) newVector = Vector.Forward rotatedVector = newQuat * newVector --or newQuat = Quaternion.New(0.0, 0.707, 0.0, 0.707) newVector = Vector.New(0.0, 0.0, 0.0) rotatedVector = newQuat * newQuat ``` ##### FromToRotation[​](#fromtorotation "Direct link to FromToRotation") static SQuaternion **FromToRotation** (SVector a, SVector b) *Creates a rotation which rotates from a to b.* *Usually you use this to rotate a transform so that one of its axes eg. the y-axis - follows a target direction b in world space.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua VectorA = Vector.New(0.0,1.0,0.0) VectorB = Vector.New(1.0,0.0,0.0) QuaternionFromToRotation = Quaternion.FromToRotation(VectorA, VectorB) ``` #### Properties[​](#properties "Direct link to Properties") ##### X[​](#x "Direct link to X") float **X** `get` `set` *X axis* * Lua ```lua newQuat = Quaternion.New(0.0, 1.0, 0.0, 0.0) newQuat.X = 40.0 ``` * Lua ```lua obj = Space.Host.ExecutingObject originalRot = obj.LocalRotation onStartMethod = function() Space.Log(originalRot.x) -- prints the X component of this object as a float originalRot.x = 0.25 -- assigns 0.25 value to the X component obj.LocalRotation = originalRot -- sets the the new rotation end obj.OnStart(onStartMethod) ``` ##### Y[​](#y "Direct link to Y") float **Y** `get` `set` *Y axis* * Lua ```lua newQuat = Quaternion.New(0.0, 1.0, 0.0, 0.0) newQuat.Y = 40.0 ``` * Lua ```lua obj = Space.Host.ExecutingObject originalRot = obj.LocalRotation onStartMethod = function() Space.Log(originalRot.y); -- prints the Y component of this object as a float originalRot.y = 0.25; -- assigns 0.25 value to the Y component obj.LocalRotation = originalRot; -- sets the the new rotation end obj.OnStart(onStartMethod); ``` ##### Z[​](#z "Direct link to Z") float **Z** `get` `set` *Z axis* * Lua ```lua newQuat = Quaternion.New(0.0, 1.0, 0.0, 0.0) newQuat.Z = 40.0 ``` * Lua ```lua local obj = Space.Host.ExecutingObject; local originalRot = obj.LocalRotation; obj.SubscribeToEvents(); local onStartMethod = function() Space.Log(originalRot.z); -- prints the Z component of this object as a float originalRot.z = 0.25; -- assigns 0.25 value to the Z component obj.LocalRotation = originalRot; -- sets the the new rotation end obj.OnStart(onStartMethod); ``` ##### W[​](#w "Direct link to W") float **W** `get` `set` *W axis* * Lua ```lua newQuat = Quaternion.New(0.0, 1.0, 0.0, 0.0) newQuat.W = 40.0 ``` * Lua ```lua local obj = Space.Host.ExecutingObject; local originalRot = obj.LocalRotation; obj.SubscribeToEvents(); local onStartMethod = function() Space.Log(originalRot.w); -- prints the W component of this object as a float originalRot.w = 0.25; -- assigns 0.25 value to the W component obj.LocalRotation = originalRot; -- sets the the new rotation end obj.OnStart(onStartMethod); ``` ##### EulerAngles[​](#eulerangles "Direct link to EulerAngles") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **EulerAngles** `get` *Returns the Euler rotation for this Quaternion* * Lua ```lua newQuat = Quaternion.New(0.0, 0.707, 0.0, 0.707) euler = newQuat.EulerAngles ``` ##### Inverse[​](#inverse "Direct link to Inverse") SQuaternion **Inverse** `get` *Returns the inverse of this quaternion* * Lua ```lua quat = Quaternion.New(0.0, 0.707, 0.0, 0.707) inverseQuat = quat.Inverse ``` ##### Identity[​](#identity "Direct link to Identity") static SQuaternion **Identity** `get` *Equivalent of new SQuaternion(0,0,0,1)* * Lua ```lua identity = Quaternion.Identity ``` --- ### SRay #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property | | ------------------------------------------------------------------------------------------------ | | SVector [**Origin** ](/scripting/client-scripting-api-reference/types/sray.md#origin)`get` | | SVector [**Direction** ](/scripting/client-scripting-api-reference/types/sray.md#direction)`get` | #### Properties[​](#properties "Direct link to Properties") ##### Origin[​](#origin "Direct link to Origin") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **Origin** `get` *The origin point of the ray.* * Lua ```lua ray=Space.Camera.ScreenCoordinatesToRay(Vector.New(0.5,0.5,0)) rayOrigin = ray.Origin ``` * Lua ```lua --this script will make this object jump to wherever you right click --(Example: moving objects with right click ) thisGameObject = Space.Host.ExecutingObject OnUpdate = function() if Space.Input.GetMouseDown(1) then clickRay = Space.Camera.ScreenCoordinatesToRay(Space.Input.MousePosition) rayCastHit = Space.Physics.RayCastSingle(clickRay.Origin, clickRay.Direction, 50.0) thisGameObject.WorldPosition = rayCastHit.Position end end thisGameObject.SubscribeToEvents() thisGameObject.OnUpdate(OnUpdate) ``` ##### Direction[​](#direction "Direct link to Direction") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **Direction** `get` *The direction of the ray.* * Lua ```lua ray=Space.Camera.ScreenCoordinatesToRay(Vector.New(0.5,0.5,0)) rayDirection = ray.Direction ``` * Lua ```lua --this script will make this object jump to wherever you right click --(Example: moving objects with right click ) thisGameObject = Space.Host.ExecutingObject OnUpdate = function() if Space.Input.GetMouseDown(1) then clickRay = Space.Camera.ScreenCoordinatesToRay(Space.Input.MousePosition) rayCastHit = Space.Physics.RayCastSingle(clickRay.Origin, clickRay.Direction, 50.0) thisGameObject.WorldPosition = rayCastHit.Position end end thisGameObject.SubscribeToEvents() thisGameObject.OnUpdate(OnUpdate) ``` --- ### SRect #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function | | ---------------------------------------------------------------------------------------------------------------------------------- | | bool [**Contains** ](srect#contains)(SVector point)
bool [**Contains** ](srect#contains)(SVector point, bool allowInverse) | | bool [**Overlaps** ](srect#overlaps)(SRect other)
bool [**Overlaps** ](srect#overlaps)(SRect other, bool allowInverse) | | bool [**Equals** ](/scripting/client-scripting-api-reference/types/srect.md#equals)(SRect other) | | string [**ToString** ](srect#tostring)(string format)
string [**ToString** ](srect#tostring)() | | | | **Static Functions** | | static SRect [**New** ](/scripting/client-scripting-api-reference/types/srect.md#new)(float x, float y, float width, float height) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property | | ----------------------------------------------------------------------------------------------- | | float [**X**](/scripting/client-scripting-api-reference/types/srect.md#x) `get` `set` | | float [**Y**](/scripting/client-scripting-api-reference/types/srect.md#y) `get` `set` | | float [**Width**](/scripting/client-scripting-api-reference/types/srect.md#width) `get` `set` | | float [**Height** ](/scripting/client-scripting-api-reference/types/srect.md#height)`get` `set` | | SVector [**Position** ](/scripting/client-scripting-api-reference/types/srect.md#position)`get` | | SVector [**Center** ](/scripting/client-scripting-api-reference/types/srect.md#center)`get` | | SVector [**Min** ](/scripting/client-scripting-api-reference/types/srect.md#min)`get` | | SVector [**Max** ](/scripting/client-scripting-api-reference/types/srect.md#max)`get` | | SVector [**Size** ](/scripting/client-scripting-api-reference/types/srect.md#size)`get` | | float [**XMin** ](/scripting/client-scripting-api-reference/types/srect.md#xmin)`get` | | float [**YMin** ](/scripting/client-scripting-api-reference/types/srect.md#ymin)`get` | | float [**XMax** ](/scripting/client-scripting-api-reference/types/srect.md#xmax)`get` | | float [**YMax** ](/scripting/client-scripting-api-reference/types/srect.md#ymax)`get` | | float [**Left** ](/scripting/client-scripting-api-reference/types/srect.md#left)`get` | | float [**Right** ](/scripting/client-scripting-api-reference/types/srect.md#right)`get` | | float [**Top** ](/scripting/client-scripting-api-reference/types/srect.md#top)`get` | | float [**Bottom** ](/scripting/client-scripting-api-reference/types/srect.md#bottom)`get` | #### Functions[​](#functions "Direct link to Functions") ##### Contains[​](#contains "Direct link to Contains") bool **Contains** ([SVector](/scripting/client-scripting-api-reference/types/svector.md) point)
bool **Contains** ([SVector](/scripting/client-scripting-api-reference/types/svector.md) point, bool allowInverse) *Returns true if the x and y components of point is a point inside this rectangle. If allowInverse is present and true, the width and height of the Rect are allowed to take negative values (ie, the min value is greater than the max), and the test will still work.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua newRect=Rect.New(0,0,150,150) otherRect = Rect.New(0,0,150,150) isContains = newRect.Contains(otherRect) --or isContains = newRect.Contains(otherRect , true) ``` ##### Overlaps[​](#overlaps "Direct link to Overlaps") bool **Overlaps** (SRect other)
bool **Overlaps** (SRect other, bool allowInverse) *Returns true if the other rectangle overlaps this one. If allowInverse is present and true, the widths and heights of the Rects are allowed to take negative values (ie, the min value is greater than the max), and the test will still work.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua newRect=Rect.New(0,0,150,150) otherRect = Rect.New(0,0,150,150) isOverlapping = newRect.Overlaps(otherRect) --or isOverlapping = newRect.Overlaps(otherRect , true) ``` ##### Equals[​](#equals "Direct link to Equals") bool **Equals** (SRect other) Returns true if the rectangles are the same. | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua newRect=Rect.New(0,0,150,150) otherRect = Rect.New(0,0,150,150) AreEqual = newRect.Equals(otherRect) ``` ##### ToString[​](#tostring "Direct link to ToString") string **ToString** (string format)
string **ToString** () Returns string for this Rect. | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua newRect=Rect.New(0,0,150,150) otherRect = Rect.New(0,0,150,150) AreEqual = newRect.Equals(otherRect) ``` ##### New[​](#new "Direct link to New") static SRect **New** (float x, float y, float width, float height) *Constructs a new SRect* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua newRect=Rect.New(0,0,150,150) ``` #### Properties[​](#properties "Direct link to Properties") ##### X[​](#x "Direct link to X") float **X** `get` `set` *Property Description* * Lua ```lua newRect=Rect.New(0,0,150,150) newRect.X = 10.0 ``` ##### Y[​](#y "Direct link to Y") float **Y** `get` `set` *Property Description* * Lua ```lua newRect=Rect.New(0,0,150,150) newRect.Y = 10.0 ``` ##### Width[​](#width "Direct link to Width") float **Width** `get` `set` *Property Description* * Lua ```lua newRect=Rect.New(0,0,150,150) newRect.Width = 10.0 ``` ##### Height[​](#height "Direct link to Height") float **Height** `get` `set` *Property Description* * Lua ```lua newRect=Rect.New(0,0,150,150) newRect.Height = 10.0 ``` ##### Position[​](#position "Direct link to Position") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **Position** `get` *The X and Y position of the rectangle.* * Lua ```lua newRect=Rect.New(50,50,150,150) positionVector = newRect.position ``` ##### Center[​](#center "Direct link to Center") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **Center** `get` *The position of the center of the rectangle.* * Lua ```lua newRect = Rect.New(50,50,150,150) VectorCenter = newRect.Center ``` ##### Min[​](#min "Direct link to Min") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **Min** `get` *The position of the minimum corner of the rectangle.* * Lua ```lua newRect=Rect.New(0,0,150,150) vectorMin = newRect.Min ``` ##### Max[​](#max "Direct link to Max") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **Max** `get` *The position of the maximum corner of the rectangle.* * Lua ```lua newRect=Rect.New(0,0,150,150) vectorMax = newRect.Max ``` ##### Size[​](#size "Direct link to Size") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **Size** `get` *The width and height of the rectangle.* * Lua ```lua newRect=Rect.New(0,0,150,150) vectorSize = newRect.Size ``` ##### XMin[​](#xmin "Direct link to XMin") float **XMin** `get` *The minimum X coordinate of the rectangle.* * Lua ```lua newRect=Rect.New(0,0,150,150) floatXMin = newRect.XMin ``` ##### YMin[​](#ymin "Direct link to YMin") float **YMin** `get` *The minimum Y coordinate of the rectangle.* * Lua ```lua newRect=Rect.New(0,0,150,150) floatYMin = newRect.YMin ``` ##### XMax[​](#xmax "Direct link to XMax") float **XMax** `get` *The maximum Y coordinate of the rectangle.* * Lua ```lua newRect=Rect.New(0,0,150,150) floatXMax = newRect.XMax ``` ##### YMax[​](#ymax "Direct link to YMax") float **YMax** `get` *The maximum Y coordinate of the rectangle.* * Lua ```lua newRect=Rect.New(0,0,150,150) floatYMax = newRect.YMax ``` ##### Left[​](#left "Direct link to Left") float **Left** `get` *Property Description* * Lua ```lua newRect=Rect.New(0,0,150,150) floatLeft = newRect.Left ``` ##### Right[​](#right "Direct link to Right") float **Right** `get` *Property Description* * Lua ```lua newRect=Rect.New(0,0,150,150) floatRight = newRect.Right ``` ##### Top[​](#top "Direct link to Top") float **Top** `get` *Property Description* * Lua ```lua newRect=Rect.New(0,0,150,150) floatTop = newRect.Top ``` ##### Bottom[​](#bottom "Direct link to Bottom") float **Bottom** `get` *Property Description* * Lua ```lua newRect=Rect.New(0,0,150,150) floatBottom = newRect.Bottom ``` --- ### SResource #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property | | --------------------------------------------------------------------------------------------------------------- | | string [**Name** ](/scripting/client-scripting-api-reference/types/sresource.md#name)`get` | | string [**Type** ](/scripting/client-scripting-api-reference/types/sresource.md#type)`get` | | string [**AsText** ](/scripting/client-scripting-api-reference/types/sresource.md#astext)`get` | | SGameObject [**AsGameObject** ](/scripting/client-scripting-api-reference/types/sresource.md#asgameobject)`get` | | SMaterial [**AsMaterial** ](/scripting/client-scripting-api-reference/types/sresource.md#asmaterial)`get` | | float [**TextureWidth** ](/scripting/client-scripting-api-reference/types/sresource.md#texturewidth)`get` | | float [**TextureHeight** ](/scripting/client-scripting-api-reference/types/sresource.md#textureheight)`get` | #### Properties[​](#properties "Direct link to Properties") ##### Name[​](#name "Direct link to Name") string **Name** `get` *Returns the name of the resource as entered in the scripting runtime* * Lua ```lua ResourceName = Space.Resources[1].Name ``` * Lua ```lua --the below script will search through the Scripting Runtime's resources --and return the first instance of an Animation Clip --[You need to add a few resources to the scripting runtime and make one of them an animation] resources = Space.Resources for i = 1, #resources do if resources[i].Type == "AnimationClip" then Space.Log("Resource #".. i .. " is an Animation Clip. The resource name is: " .. resources[i].Name) break end end ``` ##### Type[​](#type "Direct link to Type") string **Type** `get` *Returns the type of the resource as a string* * Lua ```lua ResourceType = Space.GetResource("Resource Name").Type ``` * Lua ```lua --the below script will search through the Scripting Runtime's resources --and return the first instance of an Animation Clip --[You need to add a few resources to the scripting runtime and make one of them an animation] resources = Space.Resources for i = 1, #resources do if resources[i].Type == "AnimationClip" then Space.Log("Resource #".. i .. " is an Animation Clip. The resource name is: " .. resources[i].Name) break end end ``` ##### AsText[​](#astext "Direct link to AsText") string **AsText** `get` *Converts the resource's type from SResource type to string* * Lua ```lua Text = Space.GetResource("Resource Name").AsText ``` ##### AsGameObject[​](#asgameobject "Direct link to AsGameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **AsGameObject** `get` *Property Description* * Lua ```lua GameObject = Space.GetResource("Resource Name").AsGameObject ``` ##### AsMaterial[​](#asmaterial "Direct link to AsMaterial") [SMaterial](/scripting/client-scripting-api-reference/types/smaterial.md) **AsMaterial** `get` *Converts the resource's type from SResource to SMaterial* * Lua ```lua Material = Space.GetResource("Resource Name").AsMaterial ``` ##### TextureWidth[​](#texturewidth "Direct link to TextureWidth") float **TextureWidth** `get` *Returns the Texture Width of this resource* * Lua ```lua TextureWidth = Space.GetResource("Resource Name").TextureWidth ``` ##### TextureHeight[​](#textureheight "Direct link to TextureHeight") float **TextureHeight** `get` *Returns the Texture Height of this resource* * Lua ```lua TextureHeight = Space.GetResource("Resource Name").TextureHeight ``` --- ### SScore #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property | | ----------------------------------------------------------------------------------------------- | | int [**Rank** ](/scripting/client-scripting-api-reference/types/sscore.md#rank)`get` | | long [**Score** ](/scripting/client-scripting-api-reference/types/sscore.md#score)`get` | | string [**Username** ](/scripting/client-scripting-api-reference/types/sscore.md#username)`get` | #### Properties[​](#properties "Direct link to Properties") ##### Rank[​](#rank "Direct link to Rank") int **Rank** `get` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` ##### Score[​](#score "Direct link to Score") long **Score** `get` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` ##### Username[​](#username "Direct link to Username") string **Username** `get` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` --- ### SScoreRank #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property | | -------------------------------------------------------------------------------------------------------------------------- | | int [**Level** ](/scripting/client-scripting-api-reference/types/sscorerank.md#level)`get` | | SScore\[] [**AllTimeLeaderboard** ](/scripting/client-scripting-api-reference/types/sscorerank.md#alltimeleaderboard)`get` | | SScore\[] [**DailyLeaderboard** ](/scripting/client-scripting-api-reference/types/sscorerank.md#dailyleaderboard)`get` | | SScore [**AllTimePlayerRecord** ](/scripting/client-scripting-api-reference/types/sscorerank.md#alltimeplayerrecord)`get` | | SScore [**DailyPlayerRecord** ](/scripting/client-scripting-api-reference/types/sscorerank.md#dailyplayerrecord)`get` | #### Properties[​](#properties "Direct link to Properties") ##### Level[​](#level "Direct link to Level") int **Level** `get` *The level of current activity.* * Lua ```lua Space.Activity.FinishActivity(99956,100,0,function (rank) Space.Log(rank.Level) end) ``` ##### AllTimeLeaderboard[​](#alltimeleaderboard "Direct link to AllTimeLeaderboard") SScore\[] **AllTimeLeaderboard** `get` *The AllTimeLeaderboard of current activity.* * Lua ```lua Space.Activity.FinishActivity(99956,100,0,function (rank) local leaderBoard=rank.AllTimeLeaderboard for i=1,#leaderBoard do Space.Log(leaderBoard[i].Rank) Space.Log(leaderBoard[i].Score) Space.Log(leaderBoard[i].Username) end end) ``` ##### DailyLeaderboard[​](#dailyleaderboard "Direct link to DailyLeaderboard") SScore\[] **DailyLeaderboard** `get` *The daily Leaderboard of current activity.* * Lua ```lua Space.Activity.FinishActivity(99956,100,0,function (rank) local leaderBoard=rank.DailyLeaderboard for i=1,#leaderBoard do Space.Log(leaderBoard[i].Rank) Space.Log(leaderBoard[i].Score) Space.Log(leaderBoard[i].Username) end end) ``` ##### AllTimePlayerRecord[​](#alltimeplayerrecord "Direct link to AllTimePlayerRecord") SScore **AllTimePlayerRecord** `get` *The AllTimePlayerRecord of current activity.* * Lua ```lua Space.Activity.FinishActivity(99956,100,0,function (rank) local record=rank.AllTimePlayerRecord Space.Log(record.Rank) Space.Log(record.Score) Space.Log(record.Username) end) ``` ##### DailyPlayerRecord[​](#dailyplayerrecord "Direct link to DailyPlayerRecord") SScore **DailyPlayerRecord** `get` *The daily player records of current activity.* * Lua ```lua Space.Activity.FinishActivity(99956,100,0,function (rank) local record=rank.DailyPlayerRecord Space.Log(record.Rank) Space.Log(record.Score) Space.Log(record.Username) end) ``` --- ### SSocialMedia #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | --------------------------------------------------------------------------------------------------- | | string [**Type** ](/scripting/client-scripting-api-reference/types/ssocialmedia.md#type)`get` | | string [**MediaID** ](/scripting/client-scripting-api-reference/types/ssocialmedia.md#mediaid)`get` | | string [**Url** ](/scripting/client-scripting-api-reference/types/ssocialmedia.md#url)`get` | #### Properties[​](#properties "Direct link to Properties") ##### Type[​](#type "Direct link to Type") string **Type** `get` *Property Description* * Lua ```lua tableOfSSocialMedia = Space.Profile.ActivePlayerProfile.SocialMediaProfiles profileType = tableOfSSocialMedia[1].Type ``` ##### MediaID[​](#mediaid "Direct link to MediaID") string **MediaID** `get` *Property Description* * Lua ```lua tableOfSSocialMedia = Space.Profile.ActivePlayerProfile.SocialMediaProfiles profileID = tableOfSSocialMedia[1].MediaID ``` ##### Url[​](#url "Direct link to Url") string **Url** `get` *Property Description* * Lua ```lua tableOfSSocialMedia = Space.Profile.ActivePlayerProfile.SocialMediaProfiles profileType = tableOfSSocialMedia[1].Url ``` --- ### SString #### Index[​](#index "Direct link to Index") ##### Static Functions Index[​](#static-functions-index "Direct link to Static Functions Index") | Function Name | | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | static string [**MD5** ](/scripting/client-scripting-api-reference/types/sstring.md#md5)(string input) | | static string [**SHA1** ](/scripting/client-scripting-api-reference/types/sstring.md#sha1)(string input) | | static string [**Replace** ](/scripting/client-scripting-api-reference/types/sstring.md#replace)(string old, string pattern, string replace) | | static string [**GenerateGUID** ](/scripting/client-scripting-api-reference/types/sstring.md#generateguid)() | | static string [**Base64Encode** ](sstring#base64encode)(string input)
static string [**Base64Encode** ](sstring#base64encode)(byte\[] input) | | static string [**Base64Decode** ](/scripting/client-scripting-api-reference/types/sstring.md#base64decode)(string input) | | static byte\[] [**GetBytes** ](/scripting/client-scripting-api-reference/types/sstring.md#getbytes)(string input) | | static string [**GetString** ](/scripting/client-scripting-api-reference/types/sstring.md#getstring)(byte\[] bytes) | | static string [**EncodeURL** ](/scripting/client-scripting-api-reference/types/sstring.md#encodeurl)(string input) | | static string [**DecodeURL** ](/scripting/client-scripting-api-reference/types/sstring.md#decodeurl)(string input) | | static string [**RegexMatchResult** ](/scripting/client-scripting-api-reference/types/sstring.md#regexmatchresult)(string input, string pattern, string replacement) | #### Static Functions[​](#static-functions "Direct link to Static Functions") ##### MD5[​](#md5 "Direct link to MD5") static string **MD5** (string input) *Calculates the MD5Sum of input and returns the result as a hexadecimal string* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua md5 = Space.String.MD5('AString') ``` ##### SHA1[​](#sha1 "Direct link to SHA1") static string **SHA1** (string input) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua sha1 = Space.String.SHA1('AString') ``` ##### Replace[​](#replace "Direct link to Replace") static string **Replace** (string old, string pattern, string replace) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua replaced = Space.String.Replace('AString', 'APattern', 'AReplace') ``` ##### GenerateGUID[​](#generateguid "Direct link to GenerateGUID") static string **GenerateGUID** () *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua guid = Space.String.GenerateGUID() ``` ##### Base64Encode[​](#base64encode "Direct link to Base64Encode") static string **Base64Encode** (string input) *Converts input to Base64 and returns the result* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua baseEncodeByte = Space.String.Base64Encode{117, 116, 32, 116, 100, 101}) ``` ##### Base64Decode[​](#base64decode "Direct link to Base64Decode") static string **Base64Decode** (string input) *Converts input from Base64 and returns the result* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua baseDecodedStr = Space.String.Base64Decode('aW5wdXQgdG8gZW5jb2Rl') ``` ##### GetBytes[​](#getbytes "Direct link to GetBytes") static byte\[] **GetBytes** (string input) *Converts input to bytes using UTF8 encoding* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua stringAsByteArray = Space.String.GetBytes('A String') ``` ##### GetString[​](#getstring "Direct link to GetString") static string **GetString** (byte\[] bytes) *Converts input to a UTF8 string* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua ByteArrayAsString = Space.String.GetString({115, 111, 109, 101, 32}) ``` ##### EncodeURL[​](#encodeurl "Direct link to EncodeURL") static string **EncodeURL** (string input) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua encodedURL = Space.String.EncodeURL('A String') ``` ##### DecodeURL[​](#decodeurl "Direct link to DecodeURL") static string **DecodeURL** (string input) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua decodedURL = Space.String.DecodeURL('A String') ``` ##### RegexMatchResult[​](#regexmatchresult "Direct link to RegexMatchResult") static string **RegexMatchResult** (string input, string pattern, string replacement) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Math.RegexMatchResult('astring', 'astring','astring') ``` --- ### SSubRegion #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property | | --------------------------------------------------------------------------------------------------------------- | | int [**RegionID** ](/scripting/client-scripting-api-reference/types/ssubregion.md#regionid)`get` | | int [**Count** ](/scripting/client-scripting-api-reference/types/ssubregion.md#count)`get` | | string [**ServerLocation** ](/scripting/client-scripting-api-reference/types/ssubregion.md#serverlocation)`get` | #### Properties[​](#properties "Direct link to Properties") ##### RegionID[​](#regionid "Direct link to RegionID") int **RegionID** `get` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` ##### Count[​](#count "Direct link to Count") int **Count** `get` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` ##### ServerLocation[​](#serverlocation "Direct link to ServerLocation") string **ServerLocation** `get` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` --- ### STrackInfo #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property | | ----------------------------------------------------------------------------------------------- | | string [**Title** ](/scripting/client-scripting-api-reference/types/strackinfo.md#title)`get` | | string [**Artist** ](/scripting/client-scripting-api-reference/types/strackinfo.md#artist)`get` | #### Properties[​](#properties "Direct link to Properties") ##### Title[​](#title "Direct link to Title") string **Title** `get` *Title of the track* * Lua ```lua otc = function(trackInfo) Space.Log(trackInfo.Title) end Space.Host.ExecutingObject.Radio.OnTrackChange(otc) ``` ##### Artist[​](#artist "Direct link to Artist") string **Artist** `get` *Artist of the track* * Lua ```lua otc = function(trackInfo) Space.Log(trackInfo.Artist) end Space.Host.ExecutingObject.Radio.OnTrackChange(otc) ``` --- ### STuneIn #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property | | ------------------------------------------------------------------------------------------------------ | | string [**Base** ](/scripting/client-scripting-api-reference/types/stunein.md#base)`get` `set` | | string [**Basem3u** ](/scripting/client-scripting-api-reference/types/stunein.md#basem3u)`get` `set` | | string [**Basexspf** ](/scripting/client-scripting-api-reference/types/stunein.md#basexspf)`get` `set` | #### Properties[​](#properties "Direct link to Properties") ##### Base[​](#base "Direct link to Base") string **Base** `get` `set` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` ##### Basem3u[​](#basem3u "Direct link to Basem3u") string **Basem3u** `get` `set` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` ##### Basexspf[​](#basexspf "Direct link to Basexspf") string **Basexspf** `get` `set` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` --- ### SUIRaycastResult #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function | | ------------------------------------------------------------------------------------------------------ | | void [**Clear** ](/scripting/client-scripting-api-reference/types/suiraycastresult.md#clear)() | | string [**ToString** ](/scripting/client-scripting-api-reference/types/suiraycastresult.md#tostring)() | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property | | ---------------------------------------------------------------------------------------------------------------------- | | float [**Distance** ](/scripting/client-scripting-api-reference/types/suiraycastresult.md#distance)`get` | | float [**Index** ](/scripting/client-scripting-api-reference/types/suiraycastresult.md#index)`get` | | int [**Depth** ](/scripting/client-scripting-api-reference/types/suiraycastresult.md#depth)`get` | | int [**SortingLayer** ](/scripting/client-scripting-api-reference/types/suiraycastresult.md#sortinglayer)`get` | | int [**SortingOrder** ](/scripting/client-scripting-api-reference/types/suiraycastresult.md#sortingorder)`get` | | SVector [**WorldPosition** ](/scripting/client-scripting-api-reference/types/suiraycastresult.md#worldposition)`get` | | SVector [**WorldNormal** ](/scripting/client-scripting-api-reference/types/suiraycastresult.md#worldnormal)`get` | | SVector [**ScreenPosition** ](/scripting/client-scripting-api-reference/types/suiraycastresult.md#screenposition)`get` | | SGameObject [**GameObject** ](/scripting/client-scripting-api-reference/types/suiraycastresult.md#gameobject)`get` | | bool [**IsValid** ](/scripting/client-scripting-api-reference/types/suiraycastresult.md#isvalid)`get` | #### Functions[​](#functions "Direct link to Functions") ##### Clear[​](#clear "Direct link to Clear") void **Clear** () *Reset all the parameters of this RaycastResult* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Result = Space.UI.Raycast() Result.Clear() ``` ##### ToString[​](#tostring "Direct link to ToString") string **ToString** () *Converts all the properties of this UIRaycastResult into a string* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Result = Space.UI.Raycast().ToString() ``` * Lua ```lua --This script will update a UIText element with the result of a UIRaycast whenever... --the player clicks on a Sinespace UI element thisObject = Space.Host.ExecutingObject uiText = Space.Host.GetReference("text").UIText --Add this object with UIText component as reference in Scripting Runtime OnUpdate = function() if Space.Input.GetMouseDown(0) == true then result = Space.UI.Raycast() if result.IsValid then uiText = result.ToString() end end end thisObject.OnUpdate(OnUpdate) ``` #### Properties[​](#properties "Direct link to Properties") ##### Distance[​](#distance "Direct link to Distance") float **Distance** `get` *Returns the distance of the Raycast result* * Lua ```lua Result = Distance = Space.UI.Raycast().Distance ``` * Lua ```lua --This script will update a UIText element with the Distance of the UIRaycast whenever --the player clicks on a Sinespace UI element thisObject = Space.Host.ExecutingObject uiText = Space.Host.GetReference("text").UIText --Add this object with UIText component as reference in Scripting Runtime OnUpdate = function() if Space.Input.GetMouseDown(0) == true then result = Space.UI.Raycast() if result.IsValid then uiText = result.Distance end end end thisObject.OnUpdate(OnUpdate) ``` ##### Index[​](#index-1 "Direct link to Index") float **Index** `get` *Returns the Index of the Raycast result* * Lua ```lua Index= Space.UI.Raycast().Index ``` * Lua ```lua --This script will update a UIText element with the Index of the UIRaycast whenever --the player clicks on a Sinespace UI element thisObject = Space.Host.ExecutingObject uiText = Space.Host.GetReference("text").UIText --Add this object with UIText component as reference in Scripting Runtime OnUpdate = function() if Space.Input.GetMouseDown(0) == true then result = Space.UI.Raycast() if result.IsValid then uiText = result.Index end end end thisObject.OnUpdate(OnUpdate) ``` ##### Depth[​](#depth "Direct link to Depth") int **Depth** `get` *Returns the Depth of the Raycast result* * Lua ```lua Depth= Space.UI.Raycast().Depth ``` * Lua ```lua --This script will update a UIText element with the Depth of the UIRaycast whenever --the player clicks on a Sinespace UI element thisObject = Space.Host.ExecutingObject uiText = Space.Host.GetReference("text").UIText --Add this object with UIText component as reference in Scripting Runtime OnUpdate = function() if Space.Input.GetMouseDown(0) == true then result = Space.UI.Raycast() if result.IsValid then uiText = result.Depth end end end thisObject.OnUpdate(OnUpdate) ``` ##### SortingLayer[​](#sortinglayer "Direct link to SortingLayer") int **SortingLayer** `get` *Returns the Sorting Layer of the Raycast result* * Lua ```lua SortingLayer= Space.UI.Raycast().SortingLayer ``` * Lua ```lua --This script will update a UIText element with the Sorting Layer of the UIRaycast whenever --the player clicks on a Sinespace UI element thisObject = Space.Host.ExecutingObject uiText = Space.Host.GetReference("text").UIText --Add this object with UIText component as reference in Scripting Runtime OnUpdate = function() if Space.Input.GetMouseDown(0) == true then result = Space.UI.Raycast() if result.IsValid then uiText = result.SortingLayer end end end thisObject.OnUpdate(OnUpdate) ``` ##### SortingOrder[​](#sortingorder "Direct link to SortingOrder") int **SortingOrder** `get` *Returns the Sorting Order of the Raycast result* * Lua ```lua SortingOrder= Space.UI.Raycast().SortingOrder ``` * Lua ```lua --This script will update a UIText element with the Sorting Order of the UIRaycast whenever --the player clicks on a Sinespace UI element thisObject = Space.Host.ExecutingObject uiText = Space.Host.GetReference("text").UIText --Add this object with UIText component as reference in Scripting Runtime OnUpdate = function() if Space.Input.GetMouseDown(0) == true then result = Space.UI.Raycast() if result.IsValid then uiText = result.SortingOrder end end end thisObject.OnUpdate(OnUpdate) ``` ##### WorldPosition[​](#worldposition "Direct link to WorldPosition") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **WorldPosition** `get` *Returns the World Position vector of the Raycast result* * Lua ```lua WorldPosition= Space.UI.Raycast().WorldPosition ``` * Lua ```lua --This script will update a UIText element with the World Position of the UIRaycast whenever --the player clicks on a Sinespace UI element thisObject = Space.Host.ExecutingObject uiText = Space.Host.GetReference("text").UIText --Add this object with UIText component as reference in Scripting Runtime OnUpdate = function() if Space.Input.GetMouseDown(0) == true then result = Space.UI.Raycast() if result.IsValid then uiText = result.WorldPosition end end end thisObject.OnUpdate(OnUpdate) ``` ##### WorldNormal[​](#worldnormal "Direct link to WorldNormal") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **WorldNormal** `get` *Returns the World Normal vector of the Raycast result* * Lua ```lua WorldNormal= Space.UI.Raycast().WorldNormal ``` * Lua ```lua --This script will update a UIText element with the World Normal of the UIRaycast whenever --the player clicks on a Sinespace UI element thisObject = Space.Host.ExecutingObject uiText = Space.Host.GetReference("text").UIText --Add this object with UIText component as reference in Scripting Runtime OnUpdate = function() if Space.Input.GetMouseDown(0) == true then result = Space.UI.Raycast() if result.IsValid then uiText = result.WorldNormal end end end thisObject.OnUpdate(OnUpdate) ``` ##### ScreenPosition[​](#screenposition "Direct link to ScreenPosition") [SVector](/scripting/client-scripting-api-reference/types/svector.md) **ScreenPosition** `get` *Returns the Screen Position vector of the Raycast result* * Lua ```lua ScreenPosition= Space.UI.Raycast().ScreenPosition ``` * Lua ```lua --This script will update a UIText element with the Screen Position of the UIRaycast whenever --the player clicks on a Sinespace UI element thisObject = Space.Host.ExecutingObject uiText = Space.Host.GetReference("text").UIText --Add this object with UIText component as reference in Scripting Runtime OnUpdate = function() if Space.Input.GetMouseDown(0) == true then result = Space.UI.Raycast() if result.IsValid then uiText = result.ScreenPosition end end end thisObject.OnUpdate(OnUpdate) ``` ##### GameObject[​](#gameobject "Direct link to GameObject") [SGameObject](/scripting/client-scripting-api-reference/types/sgameobject.md) **GameObject** `get` *Returns a reference to the GameObject of the Raycast result* * Lua ```lua GameObject= Space.UI.Raycast().GameObject ``` * Lua ```lua --This script will update a UIText element with the name of the UIRaycast --by accesing it's GameObject whenever the player clicks on a Sinespace UI element thisObject = Space.Host.ExecutingObject uiText = Space.Host.GetReference("text").UIText --Add this object with UIText component as reference in Scripting Runtime OnUpdate = function() if Space.Input.GetMouseDown(0) == true then result = Space.UI.Raycast() if result.IsValid then uiText = result.GameObject.Name end end end thisObject.OnUpdate(OnUpdate) ``` ##### IsValid[​](#isvalid "Direct link to IsValid") bool **IsValid** `get` *Returns whether the Raycast hit a valid UI Raycast target. This will be true if the Raycast hits an element on Sinespace's UI* * Lua ```lua IsValid= Space.UI.Raycast().IsValid ``` * Lua ```lua --This script will check if Raycast result is valid --and update a UIText element with the result of a UIRaycast whenever --the player clicks on a Sinespace UI element thisObject = Space.Host.ExecutingObject uiText = Space.Host.GetReference("text").UIText --Add this object with UIText component as reference in Scripting Runtime OnUpdate = function() if Space.Input.GetMouseDown(0) == true then result = Space.UI.Raycast() if result.IsValid then uiText = result.ToString() end end end thisObject.OnUpdate(OnUpdate) ``` --- ### SUserProfile #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ------------------------------------------------------------------------------------------------------------------------------------ | | string [**UserName** ](/scripting/client-scripting-api-reference/types/suserprofile.md#username)`get` | | string [**Title** ](/scripting/client-scripting-api-reference/types/suserprofile.md#title)`get` | | string [**RealName** ](/scripting/client-scripting-api-reference/types/suserprofile.md#realname)`get` | | string [**Gender** ](/scripting/client-scripting-api-reference/types/suserprofile.md#gender)`get` | | string [**Since** ](/scripting/client-scripting-api-reference/types/suserprofile.md#since)`get` | | string [**Country** ](/scripting/client-scripting-api-reference/types/suserprofile.md#country)`get` | | string [**City** ](/scripting/client-scripting-api-reference/types/suserprofile.md#city)`get` | | int [**SocialGold** ](/scripting/client-scripting-api-reference/types/suserprofile.md#socialgold)`get` | | int [**SocialSilver** ](/scripting/client-scripting-api-reference/types/suserprofile.md#socialsilver)`get` | | int [**SocialFlower** ](/scripting/client-scripting-api-reference/types/suserprofile.md#socialflower)`get` | | string [**Interests** ](/scripting/client-scripting-api-reference/types/suserprofile.md#interests)`get` | | string [**About** ](/scripting/client-scripting-api-reference/types/suserprofile.md#about)`get` | | SSocialMedia\[] [**SocialMediaProfiles** ](/scripting/client-scripting-api-reference/types/suserprofile.md#socialmediaprofiles)`get` | #### Properties[​](#properties "Direct link to Properties") ##### UserName[​](#username "Direct link to UserName") string **UserName** `get` *Get player profile's Username* * Lua ```lua userName = Space.Profile.ActivePlayerProfile.Username ``` ##### Title[​](#title "Direct link to Title") string **Title** `get` *Get player profile's Title* * Lua ```lua userTitle = Space.Profile.ActivePlayerProfile.Title ``` ##### RealName[​](#realname "Direct link to RealName") string **RealName** `get` *Get player profile's Real Name* * Lua ```lua userRealName = Space.Profile.ActivePlayerProfile.RealName ``` ##### Gender[​](#gender "Direct link to Gender") string **Gender** `get` *Get player profile's Gender* * Lua ```lua userGender = Space.Profile.ActivePlayerProfile.Gender ``` ##### Since[​](#since "Direct link to Since") string **Since** `get` *Get player profile's Since* * Lua ```lua userSince = Space.Profile.ActivePlayerProfile.Since ``` ##### Country[​](#country "Direct link to Country") string **Country** `get` *Get player profile's Country* * Lua ```lua userCountry = Space.Profile.ActivePlayerProfile.Country ``` ##### City[​](#city "Direct link to City") string **City** `get` *Get player profile's City* * Lua ```lua userCity = Space.Profile.ActivePlayerProfile.City ``` ##### SocialGold[​](#socialgold "Direct link to SocialGold") int **SocialGold** `get` *Get player profile's Gold Badge count* * Lua ```lua userSocialGold = Space.Profile.ActivePlayerProfile.SocialGold ``` ##### SocialSilver[​](#socialsilver "Direct link to SocialSilver") int **SocialSilver** `get` *Get player profile's Silver Badge count* * Lua ```lua userSocialSilver = Space.Profile.ActivePlayerProfile.SocialSilver ``` ##### SocialFlower[​](#socialflower "Direct link to SocialFlower") int **SocialFlower** `get` *Get player profile's Flower count* * Lua ```lua userSocialFlower = Space.Profile.ActivePlayerProfile.SocialFlower ``` ##### Interests[​](#interests "Direct link to Interests") string **Interests** `get` *Get player profile's Interests* * Lua ```lua userInterests = Space.Profile.ActivePlayerProfile.Interests ``` ##### About[​](#about "Direct link to About") string **About** `get` *Get player profile's About* * Lua ```lua userAbout = Space.Profile.ActivePlayerProfile.About ``` ##### SocialMediaProfiles[​](#socialmediaprofiles "Direct link to SocialMediaProfiles") [SSocialMedia](/scripting/client-scripting-api-reference/types/ssocialmedia.md)\[] **SocialMediaProfiles** `get` *Get player profile's Social Media Profiles* * Lua ```lua tableOfSSocialMedia = Space.Profile.ActivePlayerProfile.SocialMediaProfiles ``` --- ### SUserRegions #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property | | ------------------------------------------------------------------------------------------------------------------------------- | | int [**SubscriptionTier** ](/scripting/client-scripting-api-reference/types/suserregions.md#subscriptiontier)`get` | | int [**NumberOfRegions** ](/scripting/client-scripting-api-reference/types/suserregions.md#numberofregions)`get` | | int [**UsersPerRegion** ](/scripting/client-scripting-api-reference/types/suserregions.md#usersperregion)`get` | | int [**FileSize** ](/scripting/client-scripting-api-reference/types/suserregions.md#filesize)`get` | | string [**SubscriptionName** ](/scripting/client-scripting-api-reference/types/suserregions.md#subscriptionname)`get` | | SPublicRegion\[] [**AvailableRegions** ](/scripting/client-scripting-api-reference/types/suserregions.md#availableregions)`get` | #### Properties[​](#properties "Direct link to Properties") ##### SubscriptionTier[​](#subscriptiontier "Direct link to SubscriptionTier") int **SubscriptionTier** `get` *The subscription tier indicates which type of premium memberhsip the player has. (As found in "Region" window)* * Lua ```lua --Make's a UIText show this User's Regions' current Subscription Tier textObject = Space.Host.GetReference("TheTextReference") --add to References section in Scripting Runtime function GetUserRegionsComplete(SUserRegions) local r = SUserRegions.SubscriptionTier text.UIText.Text = r end Space.Grid.GetEnabledUserRegions(GetUserRegionsComplete) ``` ##### NumberOfRegions[​](#numberofregions "Direct link to NumberOfRegions") int **NumberOfRegions** `get` *The number of regions the player has. (As found in "Region" window)* * Lua ```lua --Make's a UIText show this User's Regions' current NumberOfRegions textObject = Space.Host.GetReference("TheTextReference") --add to References section in Scripting Runtime function GetUserRegionsComplete(SUserRegions) local r = SUserRegions.NumberOfRegions text.UIText.Text = r end Space.Grid.GetEnabledUserRegions(GetUserRegionsComplete) ``` ##### UsersPerRegion[​](#usersperregion "Direct link to UsersPerRegion") int **UsersPerRegion** `get` *The max number of users allowed per region. ("Concurrency" as found in "Region" window).* * Lua ```lua --Make's a UIText show this User's Regions' current UsersPerRegion textObject = Space.Host.GetReference("TheTextReference") --add to References section in Scripting Runtime function GetUserRegionsComplete(SUserRegions) local r = SUserRegions.UsersPerRegion text.UIText.Text = r end Space.Grid.GetEnabledUserRegions(GetUserRegionsComplete) ``` ##### FileSize[​](#filesize "Direct link to FileSize") int **FileSize** `get` *The maximum MB size the player's regions can be. ("Max Region SizE" in the "Region" window)* * Lua ```lua --Make's a UIText show this User's Regions' current FileSize textObject = Space.Host.GetReference("TheTextReference") --add to References section in Scripting Runtime function GetUserRegionsComplete(SUserRegions) local r = SUserRegions.FileSize text.UIText.Text = r end Space.Grid.GetEnabledUserRegions(GetUserRegionsComplete) ``` ##### SubscriptionName[​](#subscriptionname "Direct link to SubscriptionName") string **SubscriptionName** `get` *The name of the current player's premium subscription (as found in "Region" window)* * Lua ```lua --Make's a UIText show this User's Regions' current SubscriptionName textObject = Space.Host.GetReference("TheTextReference") --add to References section in Scripting Runtime function GetUserRegionsComplete(SUserRegions) local r = SUserRegions.SubscriptionName text.UIText.Text = r end Space.Grid.GetEnabledUserRegions(GetUserRegionsComplete) ``` ##### AvailableRegions[​](#availableregions "Direct link to AvailableRegions") [SPublicRegion](/scripting/client-scripting-api-reference/types/spublicregion.md)\[] **AvailableRegions** `get` *Returns an array of SPublicRegion which is a group of data for each of the user's available regions.* * Lua ```lua --Make's a UIText show the Name of the user's first available region textObject = Space.Host.GetReference("TheTextReference") function GetUserRegionsComplete(SUserRegions) local r = SUserRegions.AvailableRegions[1] textObject.UIText.Text = r.Name end Space.Grid.GetEnabledUserRegions(GetUserRegionsComplete) ``` --- ### SVector #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function | | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | | SVector [**Add** ](svector#add)(SVector other)
SVector [**Add** ](svector#add)(float other) | | SVector [**Scale** ](svector#scale)(SVector other)
SVector [**Scale** ](svector#scale)(float other) | | SVector [**Divide** ](svector#divide)(SVector other)
SVector [**Divide** ](svector#divide)(float other) | | float [**Distance** ](/scripting/client-scripting-api-reference/types/svector.md#distance)(SVector other) | | float [**SquareDistance** ](/scripting/client-scripting-api-reference/types/svector.md#squaredistance)(SVector other) | | bool [**InRange** ](/scripting/client-scripting-api-reference/types/svector.md#inrange)(SVector other, float range) | | SVector [**Cross** ](/scripting/client-scripting-api-reference/types/svector.md#cross)(SVector other) | | SVector [**Lerp** ](/scripting/client-scripting-api-reference/types/svector.md#lerp)(SVector other, float t) | | SVector [**Slerp** ](/scripting/client-scripting-api-reference/types/svector.md#slerp)(SVector other, float t) | | SVector [**MoveTowards** ](/scripting/client-scripting-api-reference/types/svector.md#movetowards)(SVector other, float maxDistance) | | float [**Dot** ](/scripting/client-scripting-api-reference/types/svector.md#dot)(SVector other) | | bool [**Equals** ](/scripting/client-scripting-api-reference/types/svector.md#equals)(SVector other) | | string [**ToString** ](/scripting/client-scripting-api-reference/types/svector.md#tostring)() | | | | **Static Functions** | | static SVector [**New** ](/scripting/client-scripting-api-reference/types/svector.md#new)(float x, float y, float z) | | static SVector [**operator**](svector#operator+)**+** (SVector a, SVector b)
static SVector [**operator**](svector#operator+)**+** (SVector a, float b) | | static SVector [**operator**](svector#operator)**-** (SVector a, SVector b)
static SVector [**operator**](svector#operator)**-** (SVector a, float b) | | static SVector [**operator**](svector#operator-1)\* (SVector a, SVector b)
static SVector [**operator**](svector#operator-1)\* (SVector a, float b) | | static SVector [**operator**](svector#operator-2)**/** (SVector a, SVector b)
static SVector [**operator**](svector#operator-2)**/** (SVector a, float b) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property | | -------------------------------------------------------------------------------------------------------- | | float [**X**](/scripting/client-scripting-api-reference/types/svector.md#x) `get` `set` | | float [**Y**](/scripting/client-scripting-api-reference/types/svector.md#y) `get` `set` | | float [**Z**](/scripting/client-scripting-api-reference/types/svector.md#z) `get` `set` | | float [**Magnitude** ](/scripting/client-scripting-api-reference/types/svector.md#magnitude)`get` | | SVector [**Normalised** ](/scripting/client-scripting-api-reference/types/svector.md#normalised)`get` | | | | **Static Properties** | | static SVector [**Up**](/scripting/client-scripting-api-reference/types/svector.md#up) `get` | | static SVector [**Down** ](/scripting/client-scripting-api-reference/types/svector.md#down)`get` | | static SVector [**Left** ](/scripting/client-scripting-api-reference/types/svector.md#left)`get` | | static SVector [**Right** ](/scripting/client-scripting-api-reference/types/svector.md#right)`get` | | static SVector [**Forward** ](/scripting/client-scripting-api-reference/types/svector.md#forward)`get` | | static SVector [**Back** ](/scripting/client-scripting-api-reference/types/svector.md#back)`get` | | static SVector [**Zero** ](/scripting/client-scripting-api-reference/types/svector.md#zero)`get` | | static SVector [**One** ](/scripting/client-scripting-api-reference/types/svector.md#one)`get` | | static SVector [**MaxValue** ](/scripting/client-scripting-api-reference/types/svector.md#maxvalue)`get` | | static SVector [**MinValue** ](/scripting/client-scripting-api-reference/types/svector.md#minvalue)`get` | #### Functions[​](#functions "Direct link to Functions") ##### Add[​](#add "Direct link to Add") SVector **Add** (SVector other)
SVector **Add** (float other) *Adds this Vector* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local vector = Vector.New(0, 10, 0); local vectorOther = Vector.New(40, 50, 6); Space.Log(vector.Add(vectorOther)); -- prints [40, 60, 6] Space.Log(vector + vectorOther); -- prints [40, 60, 6] ``` * Lua ```lua local vectorB = Vector.New(0, 10, 0); Space.Log(vectorB.Add(5)); -- prints [5, 15, 5] ``` ##### Scale[​](#scale "Direct link to Scale") SVector **Scale** (SVector other)
SVector **Scale** (float other) *Multiplies this Vector* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local vector = Vector.New(0, 10, 0); local vectorOther = Vector.New(2, 5, 4); Space.Log(vector.Scale(vectorOther)); -- prints [0, 50, 0] Space.Log(vector * vectorOther); -- prints [0, 50, 0] ``` * Lua ```lua local vector = Vector.New(0, 10, 0); Space.Log(vector.Scale(5)); -- prints [0, 50, 0] Space.Log(vector * 5); -- prints [0, 50, 0] ``` ##### Divide[​](#divide "Direct link to Divide") SVector **Divide** (SVector other)
SVector **Divide** (float other) *Divides this Vector* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local vector = Vector.New(10, 10, 10); local vectorOther = Vector.New(2, 2, 2); Space.Log(vector.Divide(vectorOther)); -- prints [5, 5, 5] Space.Log(vector / vectorOther); -- prints [5, 5, 5] ``` * Lua ```lua local vector = Vector.New(10, 10, 10); Space.Log(vector.Divide(2)); -- prints [5, 5, 5] Space.Log(vector / 2); -- prints [5, 5, 5] ``` ##### Distance[​](#distance "Direct link to Distance") float **Distance** (SVector other) *Returns the distance between this vector and other in meters* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local vector = Vector.New(3, 3, 3.5); local vectorOther = Vector.New(2, 2, 2); Space.Log(vector.Distance(vectorOther)); -- prints 2.06155276298523 ``` * Lua ```lua --the below script will change the objects color to green if you are near the object --and change color to red if you are far from the object thisGameObject = Space.Host.ExecutingObject function OnUpdate() positionAvatar = Space.Scene.PlayerAvatar.GameObject.WorldPosition positionObject = thisGameObject.WorldPosition if positionAvatar.Distance(positionObject) < 5 then thisGameObject.Renderer.Material.SetColor("_Color",0,1,0,1) else thisGameObject.Renderer.Material.SetColor("_Color",1,0,0,1) end end thisGameObject.OnUpdate(OnUpdate) ``` ##### SquareDistance[​](#squaredistance "Direct link to SquareDistance") float **SquareDistance** (SVector other) *Returns the square of the distance between this vector and other in meters, considerably faster than distance()* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local vector = Vector.New(3, 3, 3.5); local vectorOther = Vector.New(2, 2, 2); Space.Log(vector.SquareDistance(vectorOther)); -- prints 4.25 ``` * Lua ```lua --the below script will change the objects color to green if you are near the object --and change color to red if you are far from the object thisGameObject = Space.Host.ExecutingObject function OnUpdate() positionAvatar = Space.Scene.PlayerAvatar.GameObject.WorldPosition positionObject = thisGameObject.WorldPosition if positionAvatar.SquareDistance(positionObject) < 25 then thisGameObject.Renderer.Material.SetColor("_Color",0,1,0,1) else thisGameObject.Renderer.Material.SetColor("_Color",1,0,0,1) end end thisGameObject.OnUpdate(OnUpdate) ``` ##### InRange[​](#inrange "Direct link to InRange") bool **InRange** (SVector other, float range) *Returns if other is within range meters of this vector, inclusive* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local vector = Vector.New(370, 30, 0); local vectorOther = Vector.New(372, 30, 0); Space.Log(vector.InRange(vectorOther, 2.0)); -- prints True local vector2 = Vector.New(80, 30, 20); local vectorOther2 = Vector.New(1, 15, 25); Space.Log(vector2.InRange(vectorOther2, 1.0)); -- prints False ``` * Lua ```lua --the below script will change the objects color to green if you are near the object --and change color to red if you are far from the object --(example: motion sensor lights) thisGameObject = Space.Host.ExecutingObject function OnUpdate() positionAvatar = Space.Scene.PlayerAvatar.GameObject.WorldPosition positionObject = thisGameObject.WorldPosition if positionAvatar.InRange(positionObject, 5.0) then thisGameObject.Renderer.Material.SetColor("_Color",0,1,0,1) else thisGameObject.Renderer.Material.SetColor("_Color",1,0,0,1) end end thisGameObject.SubscribeToEvents() thisGameObject.OnUpdate(OnUpdate) ``` ##### Cross[​](#cross "Direct link to Cross") SVector **Cross** (SVector other) *Returns the cross product of this vector and other* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local vector = Vector.New(0, 1, 0); local vectorOther = Vector.New(1, 0, 0); Space.Log(vector.Cross(vectorOther)); -- prints [0, 0, -1] ``` ##### Lerp[​](#lerp "Direct link to Lerp") SVector **Lerp** (SVector other, float t) *Linear interpolates between this and other based on factor t (0-1)* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua lerpVector = currentVector.Lerp(targetVector, 0.5) ``` * Lua ```lua -- Lua Translation of Unity C# Documentation --[["StartMarker" and "EndMaker" are game objects set up as endpoints. These objects are attached to the script in the Object Reference section. The name fields in that section should match these names for the example. --]] local startMarker = Space.Host.GetReference("StartMarker"); local endMarker = Space.Host.GetReference("EndMarker"); local ball = Space.Host.ExecutingObject; local speed = 1.0; local startTime; local journeyLength; ball.SubscribeToEvents(); local onStartMethod = function() startTime = Space.Time; journeyLength = startMarker.LocalPosition.Distance(endMarker.LocalPosition); end -- This ball object will move from the start endpoint object to the end endpoint. local moveBall = function() local distCovered = (Space.Time - startTime) * speed; local fracJourney = distCovered / journeyLength; ball.LocalPosition = startMarker.LocalPosition.Lerp(endMarker.LocalPosition, fracJourney); end ball.OnStart(onStartMethod); ball.OnUpdate(moveBall); ``` ##### Slerp[​](#slerp "Direct link to Slerp") SVector **Slerp** (SVector other, float t) *Spherically linear interpolates between this and other based on factor t (0-1)* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua slerpVector = currentVector.Slerp(targetVector, 0.5) ``` * Lua ```lua -- Lua Translation of Unity C# Documentation --[["Sunrise" and "Sunset" are game objects set up as endpoints. These objects are attached to the script in the Object Reference section. The name fields in that section should match these names for the example. --]] local sunrise = Space.Host.GetReference("Sunrise"); local sunset = Space.Host.GetReference("Sunset"); local ball = Space.Host.ExecutingObject; local startTime; local journeyTime = 1.0; ball.SubscribeToEvents(); local onStartMethod = function() startTime = Space.Time; end -- This ball object will move from the start endpoint object to the end endpoint. local moveBall = function() local center = (sunrise.LocalPosition + sunset.LocalPosition) * 0.5; center = center - Vector.Up; local riseRelCenter = sunrise.LocalPosition - center; local setRelCenter = sunset.LocalPosition - center; local fracComplete = (Space.Time - startTime) / journeyTime; ball.LocalPosition = riseRelCenter.Slerp(setRelCenter, fracComplete); ball.LocalPosition = ball.LocalPosition + center; end ball.OnStart(onStartMethod); ball.OnUpdate(moveBall); ``` ##### MoveTowards[​](#movetowards "Direct link to MoveTowards") SVector **MoveTowards** (SVector other, float maxDistance) *Moves this vector closer to other by a maximum of maxDistance units* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua newVector = currentVector.MoveTowards(targetVector) ``` * Lua ```lua -- Lua Translation of Unity C# Documentation --[["Target" is a game object set up as a target position. This object is attached to the script in the Object Reference section. The name field in that section should match this name for the example. --]] local target = Space.Host.GetReference("Target"); local ball = Space.Host.ExecutingObject; local speed = 1.0;Vecto local onStartMethod = function() startTime = Space.Time; end -- This ball object will move towards the target. Negative values for -- the maxDistance parameter will push the ball away from the target. local moveBall = function() local step = speed * Space.DeltaTime; ball.LocalPosition = ball.LocalPosition.MoveTowards(target.LocalPosition, step); end ball.OnStart(onStartMethod); ball.OnUpdate(moveBall); -- NOTE: If you use MoveTowards, the movement will not overshoot the target. ``` ##### Dot[​](#dot "Direct link to Dot") float **Dot** (SVector other) *Returns the dot product between this and other (note - normalise your vectors first!* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local vectorA = Vector.New(0, 1, 0); local vectorOtherA = Vector.New(1, 0, 0); Space.Log(vectorA.Dot(vectorOtherA)); -- prints 0 local vectorB = Vector.New(0, 1, 0); local vectorOtherB = Vector.New(0, 1, 0); Space.Log(vectorB.Dot(vectorOtherB)); -- prints 1 local vectorC = Vector.New(0, 1, 0); local vectorOtherC = Vector.New(0, -1, 0); Space.Log(vectorC.Dot(vectorOtherC)); -- prints -1 ``` ##### Equals[​](#equals "Direct link to Equals") bool **Equals** (SVector other) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua isEqual = Vector.Up.Equals( Vector.New(0,1,0) ) ``` ##### ToString[​](#tostring "Direct link to ToString") string **ToString** () *Function Description* * Lua ```lua stringVector = Vector.New(0,0,0).ToString() ``` ##### New[​](#new "Direct link to New") static SVector **New** (float x, float y, float z) *Initialises vector from three floats* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua newVector = Vector.New(0, 1, 0) ``` ##### operator+[​](#operator "Direct link to operator+") static SVector **operator+** (SVector a, SVector b)
static SVector **operator+** (SVector a, float b) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua example 1 ``` ##### operator-[​](#operator- "Direct link to operator-") static SVector **operator-** (SVector a, SVector b)
static SVector **operator-** (SVector a, float b) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua example 1 ``` ##### operator\*[​](#operator-1 "Direct link to operator*") static SVector **operator**\* (SVector a, SVector b)
static SVector **operator**\* (SVector a, float b) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua example 1 ``` ##### operator/[​](#operator-2 "Direct link to operator/") static SVector **operator/** (SVector a, SVector b)
static SVector **operator/** (SVector a, float b) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua example 1 ``` #### Properties[​](#properties "Direct link to Properties") ##### X[​](#x "Direct link to X") float **X** `get` `set` *X axis (red axis)* * Lua ```lua newVect = Vector.New(0,0,0) newVect.X = 5.0 ``` * Lua ```lua local obj = Space.Host.ExecutingObject; local originalPos = obj.LocalPosition; obj.SubscribeToEvents(); local onStartMethod = function() Space.Log(originalPos.x); -- prints the X axis position of this object as a float originalPos.x = 100.0; -- assigns 100.0 value to the X axis position of this object obj.LocalPosition = originalPos; -- sets the the new position end obj.OnStart(onStartMethod); ``` ##### Y[​](#y "Direct link to Y") float **Y** `get` `set` *Y axis (green axis)* * Lua ```lua newVect = Vector.New(0,0,0) newVect.Y = 5.0 ``` * Lua ```lua local obj = Space.Host.ExecutingObject; local originalPos = obj.LocalPosition; obj.SubscribeToEvents(); local onStartMethod = function() Space.Log(originalPos.y); -- prints the Y axis position of this object as a float originalPos.y = 100.0; -- assigns 100.0 value to the Y axis position of this object obj.LocalPosition = originalPos; -- sets the the new position end obj.OnStart(onStartMethod); ``` ##### Z[​](#z "Direct link to Z") float **Z** `get` `set` *Z axis (blue axis)* * Lua ```lua newVect = Vector.New(0,0,0) newVect.Z = 5.0 ``` * Lua ```lua local obj = Space.Host.ExecutingObject local originalPos = obj.LocalPosition local onStartMethod = function() Space.Log(originalPos.z) -- prints the Z axis position of this object as a float originalPos.z = 100.0 -- assigns 100.0 value to the Z axis position of this object obj.LocalPosition = originalPos -- sets the the new position end obj.OnStart(onStartMethod) ``` ##### Magnitude[​](#magnitude "Direct link to Magnitude") float **Magnitude** `get` *Returns the magnitude of this vector* * Lua ```lua vector = Vector.New(1.0, 5.0, 0.0) vectorMagnitude = vector.Magnitude ``` ##### Normalised[​](#normalised "Direct link to Normalised") SVector **Normalised** `get` *Returns the normalised version of this vector* * Lua ```lua vector = Vector.New(0.0, 10.0, 0.0) vectorNormalised = vector.Normalised ``` ##### Up[​](#up "Direct link to Up") static SVector **Up** `get` *Equivalent of new SVector(0,1,0)* * Lua ```lua up = Vector.Up ``` * Lua ```lua --this script will make clicking this object move 2 units up on the world Y axis thisObject = Space.Host.ExecutingObject OnClick = function() thisObject.WorldPosition = thisObject.WorldPosition + (Vector.Up * 2) end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### Down[​](#down "Direct link to Down") static SVector **Down** `get` *Equivalent of new SVector(0,-1,0)* * Lua ```lua down = Vector.Down ``` * Lua ```lua --this script will make clicking this object move 2 units down on the world Y axis thisObject = Space.Host.ExecutingObject OnClick = function() thisObject.WorldPosition = thisObject.WorldPosition + (Vector.Down * 2) end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### Left[​](#left "Direct link to Left") static SVector **Left** `get` *Equivalent of new SVector(-1,0,0)* * Lua ```lua left = Vector.Left ``` * Lua ```lua --this script will make clicking this object move 2 units left on the world X axis thisObject = Space.Host.ExecutingObject OnClick = function() thisObject.WorldPosition = thisObject.WorldPosition + (Vector.Left * 2) end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### Right[​](#right "Direct link to Right") static SVector **Right** `get` *Equivalent of new SVector(1,0,0)* * Lua ```lua right = Vector.Right ``` * Lua ```lua --this script will make clicking this object move 2 units right on the world X axis thisObject = Space.Host.ExecutingObject OnClick = function() thisObject.WorldPosition = thisObject.WorldPosition + (Vector.Right * 2) end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### Forward[​](#forward "Direct link to Forward") static SVector **Forward** `get` *Equivalent of new SVector(0,0,1)* * Lua ```lua forward = Vector.Forward ``` * Lua ```lua --this script will make clicking this object move 2 units Forward on the world Z axis thisObject = Space.Host.ExecutingObject OnClick = function() thisObject.WorldPosition = thisObject.WorldPosition + (Vector.Forward * 2) end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### Back[​](#back "Direct link to Back") static SVector **Back** `get` *Equivalent of new SVector(0,0,-1)* * Lua ```lua back = Vector.Back ``` * Lua ```lua --this script will make clicking this object move 2 units Back on the world Z axis thisObject = Space.Host.ExecutingObject OnClick = function() thisObject.WorldPosition = thisObject.WorldPosition + (Vector.Back * 2) end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### Zero[​](#zero "Direct link to Zero") static SVector **Zero** `get` *Equivalent of new SVector(0,0,0)* * Lua ```lua vectorZero = Vector.Zero ``` * Lua ```lua --clicking this object move it to the center of the region <0,0,0> thisObject = Space.Host.ExecutingObject OnClick = function() thisObject.WorldPosition = Vector.Zero end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### One[​](#one "Direct link to One") static SVector **One** `get` *Equivalent of new SVector(1,1,1)* * Lua ```lua vectorOne = Vector.One ``` * Lua ```lua --clicking this object move it to the <1,1,1> coordinates of the region. thisObject = Space.Host.ExecutingObject OnClick = function() thisObject.WorldPosition = Vector.One end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClick) ``` ##### MaxValue[​](#maxvalue "Direct link to MaxValue") static SVector **MaxValue** `get` *Contains the largest possible vector* \[3.402823E+38, 3.402823E+38, 3.402823E+38] * Lua ```lua vectorMaxValue = Vector.MaxValue ``` ##### MinValue[​](#minvalue "Direct link to MinValue") static SVector **MinValue** `get` *Contains the largest possible negative vector* * Lua ```lua vectorMinValue = Vector.MinValue ``` --- ### SWebResponse #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property Name | | ----------------------------------------------------------------------------------------------------- | | string [**Error**](/scripting/client-scripting-api-reference/types/swebresponse.md#propertyname) | | string [**Response**](/scripting/client-scripting-api-reference/types/swebresponse.md#propertyname-1) | #### Properties[​](#properties "Direct link to Properties") ##### Error[​](#error "Direct link to Error") string **Error** `get` *Any error, will be empty or null if the request was successful* * Lua ```lua function ResponseFunction(responseData) stringError = responseData.Error end Space.WebServices.Get('aURL', ResponseFunction) ``` ##### Response[​](#response "Direct link to Response") string **Response** `get` *The body text of the webpage response if error is empty or null* * Lua ```lua function ResponseFunction(responseData) stringResponse = responseData.Response end Space.WebServices.Get('aURL', ResponseFunction) ``` --- ### Guides #### [πŸ“„οΈPersistence](/scripting/guides/persistence.md) [Guide on how to script persistence in Sinespace](/scripting/guides/persistence.md) --- ### Persistence The Sinespace API has a range of API functions that enable us to create different types of persistence. As scripters, we have to choose the type which is more suitable for the task at hand, or even mix and match. In this guide we will go through all the the different classes and functions and explain how to use them. #### Reference[​](#reference "Direct link to Reference") These two tables briefly explains the difference between the different types of classes and members that have persistence functionality, and we will expand even more after that. | Class | Member | Type of persistence | | --------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | | [SNetwork](../client-scripting-api-reference/network/snetwork)
(client scripting) | [SetRegionProperty](../client-scripting-api-reference/network/snetwork#setregionproperty)
[GetRegionProperty](../client-scripting-api-reference/network/snetwork#getregionproperty)
[SetShardProperty](../client-scripting-api-reference/network/snetwork#setshardproperty)
[GetShardProperty](../client-scripting-api-reference/network/snetwork#getshardproperty)
[HasShardProperties](../client-scripting-api-reference/network/snetwork#hasshardproperties) | Semi-permanent Region
Semi-permanent Region
Semi-permanent Shard
Semi-permanent Shard
Semi-permanent Shard/Region | | [SPersistence](../client-scripting-api-reference/region/spersistence)
(client scripting) | [UpdateInfo
](../client-scripting-api-reference/region/spersistence#updateinfo)[RetrieveValue](../client-scripting-api-reference/region/spersistence#retrievevalue)
[SetValue](../client-scripting-api-reference/region/spersistence#setvalue)
[UpdateRegionInfo](../client-scripting-api-reference/region/spersistence#updateregioninfo)
[RetrieveRegionValue](../client-scripting-api-reference/region/spersistence#retrieveregionvalue)
[SetRegionValue](../client-scripting-api-reference/region/spersistence#setregionvalue) | Permanent Player
Permanent Player
Permanent Player
Permanent Region
Permanent Region
Permanent Region | | [SShared](../client-scripting-api-reference/client/sshared)
(client scripting) | [SetSuperGlobal](../client-scripting-api-reference/client/sshared#setsuperglobal)
[GetSuperGlobal](../client-scripting-api-reference/client/sshared#getsuperglobal) | Semi-permanent Viewer
Semi-permanent Viewer | | [SDatabase](../server-scripting-api-reference/storage/sdatabase) (server scripting) | [GetPlayerValue](../server-scripting-api-reference/storage/sdatabase#getplayervalue)
[SetPlayerValue](../server-scripting-api-reference/storage/sdatabase#setplayervalue)
[GetRegionValue](../server-scripting-api-reference/storage/sdatabase#getregionvalue)
[SetRegionValue](../server-scripting-api-reference/storage/sdatabase#setregionvalue) | Permanent Player
Permanent Player
Permanent Region
Permanent Region | | Types of persistence | Description | | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | | Semi-permanent Region | Persistence will last until Region is closed (after all players leave the Region).Persistence applied region-wide (including all shards, if any are active). | | Semi-permanent Shard | Persistence will last until Shard is closed (after all players leave the Shard).Persistence applied only to a specific Shard. | | Semi-permanent Viewer | Persistence will last until Viewer is closed.
Persistence applied to the Viewer. | | Permanent Player | Persistence will last permanently.
Persistence applied to specific Player. | | Permanent Region | Persistence will last permanently.
Persistence applied to Region. | #### What is persistence?[​](#what-is-persistence "Direct link to What is persistence?") Sending Network Messages is cool for one off events, for example: a player waving Hello, which is relevant for only a few seconds. However, sometimes we want to make changes that are relevant for more than just a few seconds, for example: a window being opened.

If we send a Network Message to broadcast to all players that Window A is now open, when a new player enters our region, they would have missed that Network Message, and Window A would still be closed for them in their viewer.

This is why we need the ability to make certain changes to the scene **Persist**, either permanently or at least until everyone's left the region. #### SNetwork class[​](#snetwork-class "Direct link to SNetwork class") The SNetwork class has a variety of networking functions but has 4 functions and 1 property which are related to persistence. * SetRegionProperty/GetRegionProperty * SetShardProperty/GetShardProperty * HasShardProperties ##### Shard Vs Region[​](#shard-vs-region "Direct link to Shard Vs Region") You'll notice some functions apply to **Shards** and some to **Regions**. What are "shards" anyways? A Shard is a feature in Sinespace where **one** **Region** can have **multiple** **Shards** (instances), very much like parallel universes, where players on one Shard cannot see players on another Shard. For the purpose of this beginner guide, we won't go into scripting multi-Shard experiences, but it's enough to understand the differences. ##### What are Shard/Region properties?[​](#what-are-shardregion-properties "Direct link to What are Shard/Region properties?") For every Shard/Region that is open (there's players inside), there's a semi-permanent storage created on the server that holds **properties**. All scripts using these functions will access this same storage to read and write properties. This storage is a collection of **keys** and **values**. This storage will close after the Shard/Region is closed (after all players leave). ##### What "key" should you use?[​](#what-key-should-you-use "Direct link to What \"key\" should you use?") You mostly want your **key** to be a private one, so other scripts cannot access it. You are also most likely to want your key to be specific to a GameObject. We can achieve both of the above in this way: ```lua thisGameObject = Space.Host.ExecutingObject KEY = 'SomethingSecret' .. thisGameObject.ID ``` Now we've created a **key** which both **private** and **specific to a GameObject**. We will use it later to access the properties storage and read/write a specific value. ##### HasShardProperties[​](#hasshardproperties "Direct link to HasShardProperties") When a player joins the region, scripts that want to immediately access the properties database might fire off during a very tiny period where we haven't yet connected to the properties storage. This is why use **HasShardProperties** to check if the storage database is connected and ready for read/write. (HasShardProperties is used for both Shard properties and Region properties) Let's expand our previous code by adding a coroutine (run our code in a parallel thread) to take care of this: ```lua thisGameObject = Space.Host.ExecutingObject KEY = 'SomethingSecret' .. thisGameObject.ID function TheCoroutineFunction() while not Space.Network.HasShardProperties do --this while loop keeps looping until HasShardProperties returns true coroutine.yield(0) --this ensures our loop runs once per frame, otherwise it will be crashed for running too long on a single frame end --At this point we have the confirmation we need to begin read/write end Space.Host.StartCoroutine(TheCoroutineFunction) ``` ##### Setting and Getting properties[​](#setting-and-getting-properties "Direct link to Setting and Getting properties") Shard properties and Region properties are executed in the exact same way. So for the purpose of this guide we will continue using Region properties only. Note: The below to functions are usage limited to 10 calls per second. (20 calls per second on Breakroom) To get a Region property: `value = Space.Network.GetRegionProperty(KEY)` Note: Sometimes a Region property may have not been set before, so it might return **Nil**. We'll have to add a check for that. To set a Region property: `Space.Network.SetRegionProperty(KEY, 'A Value')` Note: Region property values are a string datatype, so you'll have to convert your numbers or tables to a string to store them. ```lua thisGameObject = Space.Host.ExecutingObject KEY = 'SomethingSecret' .. thisGameObject.ID function TheCoroutineFunction() while not Space.Network.HasShardProperties do --this while loop keeps looping until HasShardProperties returns true coroutine.yield(0) --this ensures our loop runs once per frame, otherwise it will be crashed for running too long on a single frame end --below part only runs after weve got our confirmation value = Space.Network.GetRegionProperty(KEY) --how to read Space.Network.SetRegionProperty(KEY, 'A Value') --how to write end Space.Host.StartCoroutine(TheCoroutineFunction) ``` ##### The window example[​](#the-window-example "Direct link to The window example") Let's write a script for a window which when clicked opens/closes and updates it's Region property, and also keeps reading the Region property incase another player opens/closes the window. We are going to add to our script two main parts. First part is constantly reading the Region property to monitor and react to changes. Second part reacts to clicks and updates the Region property which holds the state of the window (open/close). ###### The First Part[​](#the-first-part "Direct link to The First Part") ```lua thisGameObject = Space.Host.ExecutingObject KEY = 'SomethingSecret' .. thisGameObject.ID refWindow = Space.Host.GetReference("window") -- this should be linked in the Scripting Runtime "references" section function TheCoroutineForFirstPart() while true do local value = Space.Network.GetRegionProperty(KEY) --how to read if value = nil then --we're going to default the window to closed if Nil refWindow.Active = true elseif value == "Open" then --if it's "Open" we're going to make the window disappear refWindow.Active = false elseif value == "Closed" then --if it's "Closed" we're going to make the window appear refWindow.Active = true end coroutine.yield(0.2) --We'll make this run every 0.2 seconds. That's should be quick enough and we also have a limit to mind. end end function TheCoroutineFunction() while not Space.Network.HasShardProperties do --this while loop keeps looping until HasShardProperties returns true coroutine.yield(0) --this ensures our loop runs once per frame, otherwise it will be crashed for running too long on a single frame end --below part only runs after weve got our confirmation Space.Host.StartCoroutine(TheCoroutineForFirstPart) -- we can no start our coroutine which consist of the first part Space.Network.SetRegionProperty(KEY, 'A Value') --how to write end Space.Host.StartCoroutine(TheCoroutineFunction) ``` ###### The Second Part (and final code)[​](#the-second-part-and-final-code "Direct link to The Second Part (and final code)") ```lua thisGameObject = Space.Host.ExecutingObject KEY = 'SomethingSecret' .. thisGameObject.ID refWindow = Space.Host.GetReference("window") -- this should be linked in the Scripting Runtime "references" section function TheCoroutineForFirstPart() while true do local value = Space.Network.GetRegionProperty(KEY) --how to read if value = nil then --we're going to default the window to closed if Nil refWindow.Active = true elseif value == "Open" then --if it's "Open" we're going to make the window disappear refWindow.Active = false elseif value == "Closed" then --if it's "Closed" we're going to make the window appear refWindow.Active = true end coroutine.yield(0.2) --We'll make this run every 0.2 seconds. That's should be quick enough and we also have a limit to mind. end end function TheOnClickFunctionForSecondPart() --Second Part code which will update region properties when object is clicked local checkFirst = Space.Network.GetRegionProperty(KEY) if checkFirst == nil then --if it's nil, this window was never used, so we update property to open Space.Network.SetRegionProperty(KEY, "Open") elseif checkFirst == "Open" --if its "Open" we update it to "Closed" Space.Network.SetRegionProperty(KEY, "Closed") elseif checkFirst == "Closed" --if its "Closed" we update it to "Open" end end function TheCoroutineFunction() while not Space.Network.HasShardProperties do --this while loop keeps looping until HasShardProperties returns true coroutine.yield(0) --this ensures our loop runs once per frame, otherwise it will be crashed for running too long on a single frame end --below part only runs after weve got our confirmation Space.Host.StartCoroutine(TheCoroutineForFirstPart) -- we can no start our coroutine which consist of the first part Space.Network.SetRegionProperty(KEY, 'A Value') --how to write end thisGameObject.AddClickable() --we make this object a clickable thisGameObject.Clickable.OnClick(TheOnClickFunctionForSecondPart) --we add our Second Part new code to be executed On cLick Space.Host.StartCoroutine(TheCoroutineFunction) ``` #### SShared class[​](#sshared-class "Direct link to SShared class") The SShared class (client scripting) has a variety of inter-script communication functions and local viewer storage functions but has 2 functions which are related to persistence. * SetSuperGlobal * GetSuperGlobal ##### What is a Super Global?[​](#what-is-a-super-global "Direct link to What is a Super Global?") A "Global" in the SShared class is a storage within the local player's viewer accessible to all scripts. A "Super Global" is the same storage but semi-permanent; it will keep existing even when changing regions, until the viewer is closed. For this example, we will creator a clickable object that teleports us to a region, and on that region we will have a script that reacts depending where we came from. ##### What "namespace" and "key" should you use?[​](#what-namespace-and-key-should-you-use "Direct link to What \"namespace\" and \"key\" should you use?") Unlike [our previous case](/scripting/guides/persistence.md#what-key-should-you-use), these functions are storing on a specific player's viewer, and they could be meant to be accessed by multiple scripts (could be our other scripts or other scripters' scripts too). It's inherently specific to a player, and likely to a specific project or operation/objective. That's why it's accessed using a **namespace**, **key** and **value**, vs just **key** and **value**. The **namespace** could be a type of accessor which doesn't have to be private, while still having a **key** accessor that we can make private. ```lua --SCRIPT A NAMESPACE = 'space.sine.apidocs.persistenceguide' --this format is just a naming convention KEY = 'Teleported From' ``` ##### Setting and Getting Super Globals[​](#setting-and-getting-super-globals "Direct link to Setting and Getting Super Globals") When Setting a Super Global, the value need not be a **string**. It accepts a value of type **DynValue**, which means it can be a **string**, **number** or **table** etc... We set a Super Global like this: `Space.Shared.SetSuperGlobal('namespace', 'key', AVariable)` We get a Super Global like this: `value = Space.Shared.GetSuperGlobal('namespace','key')` ##### The teleporter example[​](#the-teleporter-example "Direct link to The teleporter example") We will create 2 scripts for this example. The first script will be the one teleporting us an Setting a Super Global, and the second one will be at the destination and will access our Super Global and react to where we teleported from.
We will start creating our first script by expanding on our code above by adding a clickable and make it Set a Super Global with the information we need to carry on to the second region. For the purpose of this guide we will pass our information in a Table rather than a single variable. ```lua --Script A NAMESPACE = 'space.sine.apidocs.persistenceguide' --this format is just a naming convention KEY = 'Teleported From' thisGameObject = Space.Host.ExecutingObject function OnClickFunction() local tableValue = {id = Space.Scene.RegionID, name = Space.Scene.Name} --we create a Table that holds both RegionID and Region Name Space.Shared.SetSuperGlobal(NAMESPACE,KEY, tableValue) --we Set our Super Global Space.Scene.PlayerAvatar.Teleport(0000000) -- We teleport. You'll have to replace the zeros with your region ID end thisGameObject.AddClickable() --we make the object clickable thisGameObject.Clickable.OnClick(OnClickFunction) --we hook our OnClickFunction to the clickable's OnClick event ``` Now we have an object, that when clicked, Sets a Super Global and then teleports us. On the destination region we will now create the script that processes our carried over information (regiond name and ID). ```lua --Script B NAMESPACE = 'space.sine.apidocs.persistenceguide' --this format is just a naming convention KEY = 'Teleported From' getTableValue = Space.Shared.GetSuperGlobal(NAMESPACE, KEY) Space.Log("You have arrived from region ID: ".. getTableValue.id .. " with Name: " .. getTableValue.name) ``` #### SPersistence Class[​](#spersistence-class "Direct link to SPersistence Class") The SPersistence class has 6 functions that are all used for creating permanent persistence. * UpdateInfo/UpdateRegionInfo * RetrieveValue/RetrieveRegionValue * SetValue/SetRegionValue ##### What are Region Values and Values?[​](#what-are-region-values-and-values "Direct link to What are Region Values and Values?") Half the functions in this class create Permanent Region persistence, and the other half create Permanent Player persistence. If the function has the word **region** in it, that means it creates Region persistence. If it does not, that means it creates Player persistence. Region/Player values are values in a permanent storage. Region values are in a permanent storage which is linked to the region, and (Player) Values are in a permanent storage linked to the player running the script. In terms of usage, Region Values are the equivalent to the permanent version of the[ SNetwork class](/scripting/guides/persistence.md#snetwork-class). Whereas Player values are the equivalent to the [SShared class](/scripting/guides/persistence.md#sshared-class). ##### What "key" should you use?[​](#what-key-should-you-use-1 "Direct link to What \"key\" should you use?") In the case of Region values we will be creating keys in the same way as we did for the [SNetwork class](/scripting/guides/persistence.md#what-key-should-you-use). In the case of (Player) values we will be creating keys in the same way as we did for the [SShared class](/scripting/guides/persistence.md#sshared-class). ##### Why do we need to "Update Region Info"?[​](#why-do-we-need-to-update-region-info "Direct link to Why do we need to \"Update Region Info\"?") The unique feature of this class is that it is a client scripting class, but gives us the ability to create persistence without the use of a **server script.** The storage used to achieve this is an external one, which means we have to start with using the **UpdateRegionInfo()** function to request the storage to send us a copy of it's most recent values (before trying to access these values). We do it this way: ```lua function WhatToDoWhenInfoIsReady() --We access the data we need from inside here end Space.Persistence.UpdateRegionInfo() --or UpdateInfo() for Player version ``` Unlike semi-permanent region properties, this function call is not as instant. Because it accesses an external permanent storage, we need to hook a function which will be called once the info has arrived. ```lua thisGameObject = Space.Host.ExecutingObject KEY = "Secret" .. thisGameObject.GlobalID function WhatToDoWhenInfoIsReady() value = Space.Persistence.RetrieveRegionValue(KEY) --Getting a region value Space.Log(value) --should print "Something" end Space.Persistence.SetRegionValue(KEY, "Something") --Setting a region value Space.Persistence.UpdateRegionInfo() ``` The slower or variable response speed of this functionality means that it's not recommended to be called rapidly like we did with SNetwork region properties. Therefore we might have to mix and match our code with other types of persistence. ##### Smart Lights Example[​](#smart-lights-example "Direct link to Smart Lights Example") [Visit our **Smart Lights** sample project page.](/scripting/sample-projects/smart-lights.md) #### SDatabase Class[​](#sdatabase-class "Direct link to SDatabase Class") The SDatabase class is the equivalent of the SPersistence class but the only difference being that it is accessed only through [**Server Scripts**](/scripting/guides/server-scripts.md)**.** Server scripts do not have access to the SPersistence class. A server script is also inherently semi-persistent. That means if you do this `aVariable = 5` in a server script. This variable will be persistent until all players leave the region. This makes the usage of the SDatabase class much easier than the SPersistent class due to not having to mix and match persistent methods. A downside to server scripts is that they can only be placed in furniture items and need to be loaded on a region to be used (unlike client scripts). Since this class is almost an exact copy of the SPersistence class. We will only be outlining the differences below (to avoid being repetitive). ##### Differences between SDatabase and SPersistence[​](#differences-between-sdatabase-and-spersistence "Direct link to Differences between SDatabase and SPersistence") The only two small differences between these to classes are: 1. Functions SetValue/GetValue in SPersistence, are SetPlayerValue/GetPlayerValue in SDatabase 2. GetRegionValue and GetPlayerValue have an extra **onSave** parameter which is a hook that lets us know when the value as been successfully set. ```lua --Setting a region value using SPersistence in a client script Space.Persistence.SetRegionValue(KEY, "Something") --vs --Setting a region value using SDatabase in a server script function onSave() --do something when set is succesful end Space.Database.SetRegionValue(KEY, "Something", onSave) ``` #### Thank You[​](#thank-you "Direct link to Thank You") **Thanks for completing this guide. If you run into any issues or would like to recommend improvements,**[ **please do so on this page**](/scripting/support/report-an-issue.md)**.** --- ### Server Scripts ##### What are server scripts and why do we need them?[​](#what-are-server-scripts-and-why-do-we-need-them "Direct link to What are server scripts and why do we need them?") The main difference between Server scripts and Client scripts is that they are running on the server. For **Client scripts**, each player is **running their own local version of a script**, while for **Server scripts**, all players are **running the same version of a script**. Also, server scripts and client scripts **do not share the same API**. Most of the time we should be able to achieve our task using Client scripts, specially with the availability of classes like the SNetwork or SPersistence classes, which allow scripts to communicate with each other and share data. However, we may sometimes run into tasks that are more complex and require an independent script (a server script) to be a central hub for communication, data storage, processing information, syncing etc... A good example of an interactive object that would be done using a server script is a multiplayer board game. ##### Creating a Server script:[​](#creating-a-server-script "Direct link to Creating a Server script:") * Create a GameObject. * Add the server script component to the GameObject. (Add Component -> Server Script) * Fill in the **Class ID** field with a unique identifier for your server script. (example: com.example.theserverscript) * Drag your .lua file into the **Script** field. * Add a Virtual Good component. (Add Component -> Virtual Good) * Most important part in a Server Script's Virtual Good component is that the **Type** needs to be set to **Server Script.** * Upload the GameObject . ##### Using a Server script:[​](#using-a-server-script "Direct link to Using a Server script:") * Create a GameObject. * Add a **Require Server Script** component. * Set the **Virtual Good ID** field to the same virtual good ID of your above created server script. * Set the **Class ID** field to the same class ID of your above created server script. * Add a **Room Furniture** component (Add Component -> Room Furniture) * Now this object will load the above created server script in the region it is placed in. * You can also add a **Scripting Runtime** component to this GameObject. (Add Component -> Scripting Runtime). #### Events[​](#events "Direct link to Events") Unlike client scripting where you have to create hooks/bindings to events, Server scripts only need you to declare that function without creating any hooks/bindings. For example: ```lua function OnAvatarJoin(id) Space.Log(id .. " joined the scene.") end ``` You can find [Server script events here](/scripting/server-scripting-api-reference/region/sregionscript.md#events-index). #### Sample Project[​](#sample-project "Direct link to Sample Project") The **Trivia Box** sample project is a good demonstration of how to use server scripts. [You can access it here and download it's open-source files.](/scripting/sample-projects/trivia-box.md) #### Thank You[​](#thank-you "Direct link to Thank You") **\[This guide is still in progress.**[ **Please report issues here**](/scripting/support/report-an-issue.md)**]** --- ### Sample Projects #### [πŸ“„οΈSmart Lights](/scripting/sample-projects/smart-lights.md) [This sample project is a panel that has switches to turn off/on and change the colors of all lights connected to it. This project demonstrates how we](/scripting/sample-projects/smart-lights.md) --- ### Smart Lights This sample project is a panel that has switches to turn off/on and change the colors of all lights connected to it. This project demonstrates how we can achieve permanent persistence, how a World Canvas can interface with a script and a bit of networking. Creators can access and download the project files (which are open-source) and do as they wish with it. Note: Control of the panel is limited to Owner and Admin. This can be modified in the script. You can demo this object live by going to the **Shop** -> **Furniture** -> Search for **Smart Lights** (it will be under **API Docs Sample Projects** as creator)**.** ###### How to use:[​](#how-to-use "Direct link to How to use:") * Download the package using the link below * Import into your Sinespace project (Editor Pack required) * The project folder will be under **Sinespace Sample Projects -> Smart Lights** * There's a demo scene in the Scenes folder * To connect lights to the panel, make them children of the "**Lights**" object group * In the **Virtual Goods component**, press **Clear ID** and modify the component fields with your own info * Upload. [Download PersistentSmartLights16July2022.unitypackage](/assets/files/PersistentSmartLights16July2022-956af536b0479562f583a94b380fc9a4.unitypackage) Last Updated: 6/28/2022 --- ### Trivia Box This sample project is a box that when pressed will show a trivia question on screen and users will be able to attempt to answer the trivia question using local chat. This project demonstrates how to create a server script and how client-server communications can be made to create an interactive multiplayer object. It also shows how we can access and interact with the local chat messages through scripting. Creators can access and download the project (which is open-source) and do as they wish with it. Note: Control of the box is limited to Owner and Admin. This can be modified in the script. You can demo this object live by going to the **Shop** -> **Furniture** -> Search for **Trivia Box** (it will be under **API Docs Sample Projects** as creator)**.** ###### How to use:[​](#how-to-use "Direct link to How to use:") * Download the package using the link below * Import into your Sinespace project (Editor Pack required) * The project folder will be under **Sinespace Sample Projects -> Trivia Box** * There's a demo scene in the **Scenes** folder * In the **Virtual Goods component**, press **Clear ID** and modify the component fields with your own info. * In the **VG Trivia Box Server** object, edit the **Class ID** in the **Server Script** component. * In the **VG Trivia Box object**, edit the **Virtual Good ID** and **Class ID** in the **Require Server Script** component. * Modify the project and upload. --- ### Server Scripting API #### [πŸ—ƒLibrary](/scripting/server-scripting-api-reference/library.md) [1 item](/scripting/server-scripting-api-reference/library.md) --- ### Library Helper libraries available to server scripts, including math utilities. --- ### SMath #### Index[​](#index "Direct link to Index") ##### Static Functions Index[​](#static-functions-index "Direct link to Static Functions Index") | Function Name | | --------------------------------------------------------------------------------------------------------------------------------------------------------- | | static float [**Random** ](/scripting/server-scripting-api-reference/library/smath.md#random)() | | static float [**RandomRange** ](/scripting/server-scripting-api-reference/library/smath.md#randomrange)(float min, float max) | | static int [**RandomInteger** ](/scripting/server-scripting-api-reference/library/smath.md#randominteger)(int min, int max) | | static float [**Abs** ](smath#abs)(float v)
static int [**Abs** ](smath#abs)(int v) | | static float [**Acos** ](/scripting/server-scripting-api-reference/library/smath.md#acos)(float v) | | static bool [**Approximately** ](/scripting/server-scripting-api-reference/library/smath.md#approximately)(float a, float b) | | static float [**Asin** ](/scripting/server-scripting-api-reference/library/smath.md#asin)(float v) | | static float [**Atan** ](/scripting/server-scripting-api-reference/library/smath.md#atan)(float v) | | static float [**Atan2** ](/scripting/server-scripting-api-reference/library/smath.md#atan2)(float y, float x) | | static int [**Ceil** ](/scripting/server-scripting-api-reference/library/smath.md#ceil)(float v) | | static float [**Clamp** ](/scripting/server-scripting-api-reference/library/smath.md#clamp)(float v, float min, float max) | | static float [**Clamp01** ](/scripting/server-scripting-api-reference/library/smath.md#clamp01)(float v) | | static int [**ClosestPowerOfTwo** ](/scripting/server-scripting-api-reference/library/smath.md#closestpoweroftwo)(int v) | | static float [**Cos** ](/scripting/server-scripting-api-reference/library/smath.md#cos)(float v) | | static float [**DeltaAngle** ](/scripting/server-scripting-api-reference/library/smath.md#deltaangle)(float current, float target) | | static float [**Exp** ](/scripting/server-scripting-api-reference/library/smath.md#exp)(float v) | | static int [**Floor** ](/scripting/server-scripting-api-reference/library/smath.md#floor)(float v) | | static float [**GammaToLinearSpace** ](/scripting/server-scripting-api-reference/library/smath.md#gammatolinearspace)(float v) | | static float [**InverseLerp** ](/scripting/server-scripting-api-reference/library/smath.md#inverselerp)(float a, float b, float value) | | static bool [**IsPowerOfTwo** ](/scripting/server-scripting-api-reference/library/smath.md#ispoweroftwo)(int v) | | static float [**Lerp** ](/scripting/server-scripting-api-reference/library/smath.md#lerp)(float a, float b, float v) | | static float [**LerpAngle** ](/scripting/server-scripting-api-reference/library/smath.md#lerpangle)(float a, float b, float v) | | static float [**LerpUnclamped** ](/scripting/server-scripting-api-reference/library/smath.md#lerpunclamped)(float a, float b, float v) | | static float [**LinearToGammaSpace** ](/scripting/server-scripting-api-reference/library/smath.md#lineartogammaspace)(float v) | | static float [**Log** ](smath#log)(float v)
static float [Log ](smath#log)(float v, float p) | | static float [**Log10** ](/scripting/server-scripting-api-reference/library/smath.md#log10)(float v) | | static float [**Max** ](/scripting/server-scripting-api-reference/library/smath.md#max)(float a, float b) | | static float [**Min** ](/scripting/server-scripting-api-reference/library/smath.md#min)(float a, float b) | | static float [**MoveTowards** ](/scripting/server-scripting-api-reference/library/smath.md#movetowards)(float value, float target, float delta) | | static float [**MoveTowardsAngle** ](/scripting/server-scripting-api-reference/library/smath.md#movetowardsangle)(float value, float target, float delta) | | static int [**NextPowerOfTwo** ](/scripting/server-scripting-api-reference/library/smath.md#nextpoweroftwo)(int v) | | static float [**PerlinNoise** ](/scripting/server-scripting-api-reference/library/smath.md#perlinnoise)(float x, float y) | | static float [**PingPong** ](/scripting/server-scripting-api-reference/library/smath.md#pingpong)(float t, float length) | | static float [**Pow** ](/scripting/server-scripting-api-reference/library/smath.md#pow)(float value, float pow) | | static float [**Repeat** ](/scripting/server-scripting-api-reference/library/smath.md#repeat)(float value, float length) | | static int [**Round** ](/scripting/server-scripting-api-reference/library/smath.md#round)(float value) | | static float [**Sign** ](/scripting/server-scripting-api-reference/library/smath.md#sign)(float value) | | static float [**Sin** ](/scripting/server-scripting-api-reference/library/smath.md#sin)(float value) | | static float [**SmoothStep** ](/scripting/server-scripting-api-reference/library/smath.md#smoothstep)(float from, float to, float t) | | static float [**Sqrt** ](/scripting/server-scripting-api-reference/library/smath.md#sqrt)(float value) | | static float [**Tan** ](/scripting/server-scripting-api-reference/library/smath.md#tan)(float value) | ##### Static Attributes Index[​](#static-attributes-index "Direct link to Static Attributes Index") | Property Name | | ----------------------------------------------------------------------------------------------------- | | static readonly float [**Pi**](/scripting/server-scripting-api-reference/library/smath.md#pi)\*\*\*\* | #### Static Functions[​](#static-functions "Direct link to Static Functions") ##### Random[​](#random "Direct link to Random") static float **Random** () *Returns a random float between 0 and 1 (inclusive)* * Lua ```lua local randomNumber = Space.Math.Random(); Space.Log(randomNumber); -- prints 0.689094245433807 ``` ##### RandomRange[​](#randomrange "Direct link to RandomRange") static float **RandomRange** (float min, float max) *Returns a random float between min and max (inclusive)* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local min = 100.0; local max = 500.0; local randomNumber = Space.Math.RandomRange(min, max ); Space.Log(randomNumber); -- prints 0206.659149169922 ``` ##### RandomInteger[​](#randominteger "Direct link to RandomInteger") static int **RandomInteger** (int min, int max) *Returns a random float between min (inclusive) and max (exclusive)* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local min = 50; local max = 75; local randomInteger = Space.Math.RandomInteger(min, max); Space.Log(randomInteger); -- prints 52 ``` ##### Abs[​](#abs "Direct link to Abs") static float **Abs** (float v)
static int **Abs** (int v) *Returns the absolute value of 'val'* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local value = -4.2 local absoluteNum = Space.Math.Abs(value); Space.Log(absoluteNum); -- prints 4 [BUG] should be 4.2 ``` ##### Acos[​](#acos "Direct link to Acos") static float **Acos** (float v) *Returns the arc cosine value of 'val'* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local value = 0.5; local arcCosine = Space.Math.Acos(value); Space.Log(arcCosine); -- prints 1.04719758033752 (radians) which is 60 degrees ``` ##### Approximately[​](#approximately "Direct link to Approximately") static bool **Approximately** (float a, float b) *True if the difference between a and b is less than epsilon* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local a = 5.0; local b = 5; local approx1 = Space.Math.Approximately(a, b); Space.Log(approx1); -- prints true local a = 5.01; local b = 5.0; local approx2 = Space.Math.Approximately(a, b); Space.Log(approx2); -- prints false local a = 5.01; local b = 5.0; local approx3 = Space.Math.Approximately(a, b); Space.Log(approx3); -- prints false ``` ##### Asin[​](#asin "Direct link to Asin") static float **Asin** (float v) *Returns the arc sine value of 'val'* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local value = 0.5; local arcSine = Space.Math.Asin(value); Space.Log(arcSine); -- prints 0.523598790168762 (radians) which is 30 degrees ``` ##### Atan[​](#atan "Direct link to Atan") static float **Atan** (float v) *Returns the arc tangent value of 'val'* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local value = 1.732050808; local arcTangent = Space.Math.Atan(value); Space.Log(arcTangent); -- prints 1.04719758033752 (radians) which is 60 degrees ``` ##### Atan2[​](#atan2 "Direct link to Atan2") static float **Atan2** (float y, float x) *Returns the arc tangent of y/x* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local x = 0.5; local y = 0.5; local arcTangent = Space.Math.Atan2(y, x); Space.Log(arcTangent); -- prints 0.785398185253143 ``` ##### Ceil[​](#ceil "Direct link to Ceil") static int **Ceil** (float v) *Returns the ceil value of 'val' as an integer* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Log(Space.Math.Ceil(4.0)); -- prints 4 Space.Log(Space.Math.Ceil(4.2)); -- prints 5 Space.Log(Space.Math.Ceil(-4.2)); -- prints -4 ``` ##### Clamp[​](#clamp "Direct link to Clamp") static float **Clamp** (float v, float min, float max) *Clamps val between min and max, and returns the result* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local value = 100.0; local min = 20.0; local max = 82.0; local clampedValue = Space.Math.Clamp(value, min, max); Space.Log(clampedValue); -- prints 82 ``` ##### Clamp01[​](#clamp01 "Direct link to Clamp01") static float **Clamp01** (float v) *Clamps val between 0 and 1, and returns the result* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local value = -1.0; local clampedValue = Space.Math.Clamp01(value); Space.Log(clampedValue); -- prints 0 ``` ##### ClosestPowerOfTwo[​](#closestpoweroftwo "Direct link to ClosestPowerOfTwo") static int **ClosestPowerOfTwo** (int v) *Returns the closest power of two to val* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local value = 33; local powerOfTwo = Space.Math.ClosestPowerOfTwo(value); Space.Log(powerOfTwo); -- prints 32 ``` ##### Cos[​](#cos "Direct link to Cos") static float **Cos** (float v) *Returns the cosine of val* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local angle = 1.04719758033752; -- converts to 60 degrees local cosine = Space.Math.Cos(angle); Space.Log(cosine); -- prints 0.499999970197678 local angle2 = Space.Math.Pi/3; -- converts to 60 degrees local cosine2 = Space.Math.Cos(angle2); Space.Log(cosine2); -- prints 0.499999970197678 ``` ##### DeltaAngle[​](#deltaangle "Direct link to DeltaAngle") static float **DeltaAngle** (float current, float target) \_Returns the difference in degrees between two values (e.g. 350' and 17' returns 27') \_ | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Log(Space.Math.DeltaAngle(350.0, 17.0)); -- prints 27 ``` ##### Exp[​](#exp "Direct link to Exp") static float **Exp** (float v) *Returns e raised to val power.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Log(Space.Math.Exp(3.0)); -- prints 20.0855369567871 ``` ##### Floor[​](#floor "Direct link to Floor") static int **Floor** (float v) *Returns floor of val, converted to an int* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Log(Space.Math.Floor(4.0)); -- prints 4 Space.Log(Space.Math.Floor(4.2)); -- prints 4 Space.Log(Space.Math.Floor(-4.2)); -- prints -5 ``` ##### GammaToLinearSpace[​](#gammatolinearspace "Direct link to GammaToLinearSpace") static float **GammaToLinearSpace** (float v) *Converts a colour value from Gamma to Linear Space (Pow 2.2)* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Log(Space.Math.GammaToLinearSpace(0.5)); -- prints 0.214041143655777 ``` ##### InverseLerp[​](#inverselerp "Direct link to InverseLerp") static float **InverseLerp** (float a, float b, float value) *Returns the percentage between a and b that 'val' is on a line (opposite of Lerp)* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local sliderStart = 0.0; local sliderStop = 100.0; local currentSliderPos = 75.0; local percentage = Space.Math.InverseLerp(sliderStart, sliderStop, currentSliderPos); Space.Log(percentage); -- prints 0.75 ``` ##### IsPowerOfTwo[​](#ispoweroftwo "Direct link to IsPowerOfTwo") static bool **IsPowerOfTwo** (int v) *Returns true if val is a power of two* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Log(Space.Math.IsPowerOfTwo(55)); -- prints False Space.Log(Space.Math.IsPowerOfTwo(32)); -- prints True ``` ##### Lerp[​](#lerp "Direct link to Lerp") static float **Lerp** (float a, float b, float v) *Interpolates between 'a' and 'b' based on 'val', assuming 'val' is between 0 and 1* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local sliderStart = 0.0; local sliderStop = 100.0; local percentage = 0.75; local currentSliderPos = Space.Math.Lerp(sliderStart, sliderStop, percentage); Space.Log(currentSliderPos); -- prints 75 ``` ##### LerpAngle[​](#lerpangle "Direct link to LerpAngle") static float **LerpAngle** (float a, float b, float v) *Interpolates between angles 'a' and 'b' based on 'val', assuming 'val' is between 0 and 1* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local sliderStartAngle = 0.0; local sliderStopAngle = Space.Math.Pi;-- 180 degrees local percentage = 0.50; local currentSliderPos = Space.Math.LerpAngle(sliderStartAngle, sliderStopAngle, percentage); Space.Log(currentSliderPos); -- prints 1.57079637050629 (90 degrees) ``` ##### LerpUnclamped[​](#lerpunclamped "Direct link to LerpUnclamped") static float **LerpUnclamped** (float a, float b, float v) *Interpolates between 'a' and 'b' based on 'val', assuming 'val' is between 0 and 1, but unbounded (allowing higher/lower values)* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local sliderStart = 0.0; local sliderStop = 100.0; local percentage = 2.0; local currentSliderPos = Space.Math.LerpUnclamped(sliderStart, sliderStop, percentage); Space.Log(currentSliderPos); -- prints 200 ``` ##### LinearToGammaSpace[​](#lineartogammaspace "Direct link to LinearToGammaSpace") static float **LinearToGammaSpace** (float v) *Converts a colour value from Linear to Gamma Space (Pow 1/2.2)* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Log(Space.Math.LinearToGammaSpace(0.214041143655777)); -- prints 0.5 ``` ##### Log[​](#log "Direct link to Log") static float **Log** (float v)
static float **Log** (float v, float p) *Returns the natural logarithm for 'val'* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Log(Space.Math.Log(30.0)); -- prints 3.40119743347168 Space.Log(Space.Math.Log(4.0, 2.0)); -- prints 2 ``` ##### Log10[​](#log10 "Direct link to Log10") static float **Log10** (float v) *Returns the Log10 value for 'val'* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Log(Space.Math.Log10(100.0)); -- prints 2 ``` ##### Max[​](#max "Direct link to Max") static float **Max** (float a, float b) *Returns higher of 'a' or 'b'* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Log(Space.Math.Max(20.0, 100.0)); -- prints 100 ``` ##### Min[​](#min "Direct link to Min") static float **Min** (float a, float b) *Returns lower of 'a' or 'b'* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Log(Space.Math.Min(20.0, 100.0)); -- prints 20 ``` ##### MoveTowards[​](#movetowards "Direct link to MoveTowards") static float **MoveTowards** (float value, float target, float delta) *Move value to target, but by no more than delta* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local sliderStart = 5.0; local sliderStop = 10.0; local deltaChange = 1.0; local currentSliderPos = Space.Math.MoveTowards(sliderStart, sliderStop, deltaChange); Space.Log(currentSliderPos); -- prints 6 (moves forward 1) local sliderStart = 5.0; local sliderStop = 10.0; local deltaChange = 7.0; local currentSliderPos = Space.Math.MoveTowards(sliderStart, sliderStop, deltaChange); Space.Log(currentSliderPos); -- prints 10 (caps out at at the target value) -- NOTE: Use negative delta to move away from target. ``` ##### MoveTowardsAngle[​](#movetowardsangle "Direct link to MoveTowardsAngle") static float **MoveTowardsAngle** (float value, float target, float delta) *Move angle value to target, but by no more than delta* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local sliderStartAngle = Space.Math.Pi/2; -- 90 degrees local sliderStopAngle = Space.Math.Pi; -- 180 degrees local deltaChange = Space.Math.Pi/6; -- 30 degrees local currentSliderPos = Space.Math.MoveTowardsAngle(sliderStartAngle, sliderStopAngle, deltaChange); Space.Log(currentSliderPos); -- prints 2.09439516067505 (moves forward 30 degrees to 120 degrees) -- NOTE: Add 180 degrees (Space.Math.Pi) to move away from target. ``` ##### NextPowerOfTwo[​](#nextpoweroftwo "Direct link to NextPowerOfTwo") static int **NextPowerOfTwo** (int v) *Return the next power of two larger or equal to val* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Log(Space.Math.NextPowerOfTwo(16)); -- prints 16 Space.Log(Space.Math.NextPowerOfTwo(17)); -- prints 32 ``` ##### PerlinNoise[​](#perlinnoise "Direct link to PerlinNoise") static float **PerlinNoise** (float x, float y) *Return 2D Perlin noise for coordinates x and y* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua -- Lua Translation of Unity C# Documentation local ball = Space.Host.ExecutingObject; ball.SubscribeToEvents(); -- animates this object to move upwards on the y axis with slight random movement local animateBall = function() local heightScale = 0.1; -- controls speed of movement local xScale = 1.0; -- shifts x position on perlin noise plane local height = heightScale * Space.Math.PerlinNoise(Space.Time * xScale, 0.0); local pos = ball.LocalPosition; pos.y = pos.y + height; ball.LocalPosition = pos; Space.Log(pos.y); end ball.OnUpdate(animateBall); -- NOTE: If you need a guaranteed range of [0,1], make sure to clamp the value with Space.Math.Clamp01. ``` ##### PingPong[​](#pingpong "Direct link to PingPong") static float **PingPong** (float t, float length) *Return a value between 0 and length that oscillates upwards and back based on the position of 'val'* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua --[[ In this example, if you traced the output of Space.Math.PingPong(value, length), the return values would cycle forward through the range [0,5] then cycle backwards through the range [5,0] in order. --]] local ball = Space.Host.ExecutingObject; local originalPos = ball.LocalPosition; ball.SubscribeToEvents(); -- The ball object oscillates back and forth on the x-axis. local animateBall = function() local value = Space.Time; local length = 5.0; local newPos = Vector.New(Space.Math.PingPong(value, length) + originalPos.x, originalPos.y, originalPos.z); ball.LocalPosition = newPos; end ball.OnUpdate(animateBall); ``` ##### Pow[​](#pow "Direct link to Pow") static float **Pow** (float value, float pow) *Return x raised to y power* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Log(Space.Math.Pow(2, 4)); -- prints 16 ``` ##### Repeat[​](#repeat "Direct link to Repeat") static float **Repeat** (float value, float length) *Return a value between 0 and length that returns to 0 after exceeding length based on 'val'* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua --[[ In this example, if you traced the output of Space.Math.Repeat(value, length), the return values would cycle forward through the range [0,5]. The cycle is repeated again from 0.--]] local ball = Space.Host.ExecutingObject; local originalPos = ball.LocalPosition; ball.SubscribeToEvents(); -- The ball object moves forward on the x-axis. -- Then, it repeats the same motion again from the beginning. local animateBall = function() local value = Space.Time; local length = 5.0; local newPos = Vector.New(Space.Math.Repeat(value, length) + originalPos.x, originalPos.y, originalPos.z); ball.LocalPosition = newPos; end ball.OnUpdate(animateBall); ``` ##### Round[​](#round "Direct link to Round") static int **Round** (float value) *Returns the nearest integer value to val* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Log(Space.Math.Round(4.0)); -- prints 4 Space.Log(Space.Math.Round(4.2)); -- prints 4 Space.Log(Space.Math.Round(4.5)); -- prints 4 Space.Log(Space.Math.Round(4.55)); -- prints 5 Space.Log(Space.Math.Round(4.8)); -- prints 5 Space.Log(Space.Math.Round(-4.2)); -- prints -4 Space.Log(Space.Math.Round(-4.8)); -- prints -5 ``` ##### Sign[​](#sign "Direct link to Sign") static float **Sign** (float value) *Returns either 1 or -1 based on the sign of 'val'* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Log(Space.Math.Sign(4.2)); -- prints 1 Space.Log(Space.Math.Sign(-4.2)); -- prints -1 ``` ##### Sin[​](#sin "Direct link to Sin") static float **Sin** (float value) *Returns the sine of val* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local angle = 1.04719758033752; -- converts to 60 degrees local sine = Space.Math.Sin(angle); Space.Log(sine); -- prints 0.866025447845459 local angle2 = Space.Math.Pi/3; -- converts to 60 degrees local sine2 = Space.Math.Sin(angle2); Space.Log(sine2); -- prints 0.866025447845459 ``` ##### SmoothStep[​](#smoothstep "Direct link to SmoothStep") static float **SmoothStep** (float from, float to, float t) *Similar to Lerp but moves slowly closer to the edges ('Spherical Lerp')* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua -- Lua Translation of Unity C# Documentation --[[ In this example, Space.Math.SmoothStep(min, max, time) returns values in the range [1,10] in order. As values approach 10, the interpolation slows down. --]] local ball = Space.Host.ExecutingObject; local originalPos = ball.LocalPosition; local min = 1.0; local max = 10.0; local duration = 5.0; --lower value to speed up; raise to slow down local startTime; ball.SubscribeToEvents(); local initStartTime = function() startTime = Space.Time; end -- The ball jumps to min + originalPos, then it moves towards -- max + originalPos while slowing down at the end. local animateBall = function() local time = (Space.Time - startTime) / duration; local newPos = Vector.New(Space.Math.SmoothStep(min, max, time) + originalPos.x, originalPos.y, originalPos.z); ball.LocalPosition = newPos; end ball.OnStart(initStartTime); ball.OnUpdate(animateBall); ``` ##### Sqrt[​](#sqrt "Direct link to Sqrt") static float **Sqrt** (float value) *Returns the square root of val* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Log(Space.Math.Sqrt(16)); -- prints 4 Space.Log(Space.Math.Sqrt(-16)); -- prints NaN ``` ##### Tan[​](#tan "Direct link to Tan") static float **Tan** (float value) *Returns the tangent value of 'val'* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local angle = 1.04719758033752; -- converts to 60 degrees local tangent = Space.Math.Tan(angle); Space.Log(tangent); -- prints 1.73205089569092 local angle2 = Space.Math.Pi/3; -- converts to 60 degrees local tangent2 = Space.Math.Tan(angle2); Space.Log(tangent2); -- prints 1.73205089569092 ``` #### Static Attributes[​](#static-attributes "Direct link to Static Attributes") ##### Pi[​](#pi "Direct link to Pi") static readonly float **Pi** = 3.14159265358979f *Returns the constant value of Ξ .* * Lua ```lua Space.Log(Space.Math.Pi); -- prints 3.14159274101257 ``` --- ### Network Networking APIs for server scripts, covering shared data and outbound web requests. --- ### SShared #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | void [**SetGlobal** ](/scripting/server-scripting-api-reference/network/sshared.md#setglobal)(string ns, string key, DynValue value) | | DynValue [**GetGlobal** ](/scripting/server-scripting-api-reference/network/sshared.md#getglobal)(string ns, string key) | | void [**RegisterFunction** ](/scripting/server-scripting-api-reference/network/sshared.md#registerfunction)(string ns, string func, Closure reference) | | void [**RegisterBroadcastFunction** ](/scripting/server-scripting-api-reference/network/sshared.md#registerbroadcastfunction)(string ns, string func, Closure reference) | | void [**UnregisterBroadcastFunction** ](sshared#unregisterbroadcastfunction)(string ns, string func, Closure reference)
void **UnregisterBroadcastFunction** (string ns, string func) | | void [**CallFunction** ](/scripting/server-scripting-api-reference/network/sshared.md#callfunction)(string ns, string func, IEnumerable< DynValue > args) | | int [**CallBroadcastFunction** ](/scripting/server-scripting-api-reference/network/sshared.md#callbroadcastfunction)(string ns, string func, IEnumerable< DynValue > args) | #### Functions[​](#functions "Direct link to Functions") ##### SetGlobal[​](#setglobal "Direct link to SetGlobal") void **SetGlobal** (string ns, string key, DynValue value) *Sets a global key to a value. The value can be any object type.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Shared.SetGlobal("com.someNameHere.world", "version", "1.02"); ``` ##### GetGlobal[​](#getglobal "Direct link to GetGlobal") DynValue **GetGlobal** (string ns, string key) *Retrieves a previously set global variable, or returns nil.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua local versionValue = Space.Shared.GetGlobal("com.someNameHere.world", "version") ``` ##### RegisterFunction[​](#registerfunction "Direct link to RegisterFunction") void **RegisterFunction** (string ns, string func, Closure reference) *Makes func into a global function that can be accessed anywhere.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua function someFunction(name) Space.Log("Hello " .. name); end Space.Shared.RegisterFunction("com.someNameHere.world", "func", someFunction); ``` ##### RegisterBroadcastFunction[​](#registerbroadcastfunction "Direct link to RegisterBroadcastFunction") void **RegisterBroadcastFunction** (string ns, string func, Closure reference) *Makes func into a global function that can be accessed anywhere.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua function someFunction(name) Space.Log("Hello " .. name); end Space.Shared.RegisterBroadcastFunction("com.someNameHere.world", "func", someFunction); ``` ##### UnregisterBroadcastFunction[​](#unregisterbroadcastfunction "Direct link to UnregisterBroadcastFunction") void **UnregisterBroadcastFunction** (string ns, string func, Closure reference)
void **UnregisterBroadcastFunction** (string ns, string func) *Unregister Broadcast Function.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua example 1 ``` ##### CallFunction[​](#callfunction "Direct link to CallFunction") void **CallFunction** (string ns, string func, IEnumerable< DynValue > args) *Calls the registered function with the specified arguments.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Shared.CallFunction("com.someNameHere.world", "func",{"Smith"}); ``` ##### CallBroadcastFunction[​](#callbroadcastfunction "Direct link to CallBroadcastFunction") int **CallBroadcastFunction** (string ns, string func, IEnumerable< DynValue > args) *Calls every registered broadcast function with the specified arguments, and returns the number of calls queued.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua example 1 ``` --- ### SWebservice #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function | | -------------------------------------------------------------------------------------------------------------------------------------------------------- | | void [**Get** ](/scripting/server-scripting-api-reference/network/swebservice.md#get)(string url, Closure onComplete, Table headers=null) | | void [**Post** ](/scripting/server-scripting-api-reference/network/swebservice.md#post)(string url, string data, Closure onComplete, Table headers=null) | #### Functions[​](#functions "Direct link to Functions") ##### Get[​](#get "Direct link to Get") void **Get** (string url, Closure onComplete, Table headers=null) *Performs an HTTP\[S] GET. The callback receives two parameters: `success` (bool) and `response` (string).* | Parameter | Type | Description | | ---------- | ---------------- | --------------------------------------------------------------------------------------------------------- | | url | string | The absolute URL to request. | | onComplete | Closure | Callback `(bool success, string response)` invoked on completion. | | headers | Table (optional) | Supported keys: `Bearer` (maps to `Authorization: Bearer `), `Content-Type` (rarely used for GET). | * Lua ```lua -- Simple GET local url = "https://httpbin.org/get" Space.WebServices.Get(url, function(success, response) if success then Space.Log("OK: " .. response) else Space.Log("Request failed: " .. response) end end) ``` * Lua ```lua -- GET with Bearer auth local url = "https://api.example.com/me" local headers = { ["Bearer"] = "YOUR_ACCESS_TOKEN" } Space.WebServices.Get(url, function(success, response) if success then Space.Log(response) else Space.Log("Error: " .. response) end end, headers) ``` ##### Post[​](#post "Direct link to Post") void **Post** (string url, string data, Closure onComplete, Table headers=null) *Performs an HTTP\[S] POST. The callback receives two parameters: `success` (bool) and `response` (string).* | Parameter | Type | Description | | ---------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------- | | url | string | The absolute URL to POST to. | | data | string | Request body string. For JSON, send a JSON string and set `Content-Type`. | | onComplete | Closure | Callback `(bool success, string response)` invoked on completion. | | headers | Table (optional) | Supported keys: `Content-Type` (defaults to `application/x-www-form-urlencoded`), `Bearer` (maps to `Authorization: Bearer `). | * Lua ```lua -- Form POST local url = "https://httpbin.org/post" local body = "x=1&y=2" Space.WebServices.Post(url, body, function(success, response) if success then Space.Log("OK: " .. response) else Space.Log("Error: " .. response) end end) ``` * Lua ```lua -- JSON POST with Bearer auth local url = "https://api.example.com/widgets" local body = '{"name":"Server Created Widget"}' local headers = { ["Content-Type"] = "application/json", ["Bearer"] = "YOUR_ACCESS_TOKEN" } Space.WebServices.Post(url, body, function(success, response) if success then Space.Log("Created: " .. response) else Space.Log("Error: " .. response) end end, headers) ``` Note: * Server requests automatically include: `X-Sinespace-Region-ID`, `X-Sinespace-Instance-ID`, `X-Sinespace-Script-ID`, `X-Sinespace-Runtime-Type`, and `X-Sinespace-In-Editor`. * There is no `timeout` parameter on server web requests. --- ### Scene APIs for the region from the server's perspective β€” scenes, parcels, cells, objects, and the avatars present within them. --- ### SAvatar #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property | | ----------------------------------------------------------------------------------------------------- | | int [**ID**](/scripting/server-scripting-api-reference/region/savatar.md#id) `get` | | Vector3 [**Position** ](/scripting/server-scripting-api-reference/region/savatar.md#position)`get` | | Vector3 [**Velocity** ](/scripting/server-scripting-api-reference/region/savatar.md#velocity)`get` | | Quaternion [**Rotation** ](/scripting/server-scripting-api-reference/region/savatar.md#rotation)`get` | | string [**Username** ](/scripting/server-scripting-api-reference/region/savatar.md#username)`get` | | string [**Title** ](/scripting/server-scripting-api-reference/region/savatar.md#title)`get` | #### Properties[​](#properties "Direct link to Properties") ##### ID[​](#id "Direct link to ID") int **ID** `get` *Avatar's ID* * Lua ```lua ID = Space.Scene.Avatars[1].ID ``` * Lua ```lua --server script that prints a list of IDs of players online whenever someone joins function OnAvatarJoin(id) local numOfAvatars = Space.Scene.ConnectedAvatars for num =1 , numOfAvatars, 1 do Space.Log(Space.Scene.Avatars[num].ID) end end ``` ##### Position[​](#position "Direct link to Position") Vector3 **Position** `get` *Avatar's position* * Lua ```lua ID = Space.Scene.Avatars[1].Position ``` * Lua ```lua --server script that prints a list of Positions of players online whenever someone joins function OnAvatarJoin(id) local numOfAvatars = Space.Scene.ConnectedAvatars for num =1 , numOfAvatars, 1 do Space.Log(Space.Scene.Avatars[num].Position) end end ``` ##### Velocity[​](#velocity "Direct link to Velocity") Vector3 **Velocity** `get` *Avatar's Velocity* * Lua ```lua ID = Space.Scene.Avatars[1].Velocity ``` * Lua ```lua --server script that prints a list of Velocitys of players online whenever someone joins function OnAvatarJoin(id) local numOfAvatars = Space.Scene.ConnectedAvatars for num =1 , numOfAvatars, 1 do Space.Log(Space.Scene.Avatars[num].Velocity) end end ``` ##### Rotation[​](#rotation "Direct link to Rotation") Quaternion **Rotation** `get` *Avatar's Rotation* * Lua ```lua ID = Space.Scene.Avatars[1].Quaternion ``` * Lua ```lua --server script that prints a list of Rotations of players online whenever someone joins function OnAvatarJoin(id) local numOfAvatars = Space.Scene.ConnectedAvatars for num =1 , numOfAvatars, 1 do Space.Log(Space.Scene.Avatars[num].Rotation) end end ``` ##### Username[​](#username "Direct link to Username") string **Username** `get` *Avatar's Username* * Lua ```lua ID = Space.Scene.Avatars[1].Username ``` * Lua ```lua --server script that prints a list of Usernames of players online whenever someone joins function OnAvatarJoin(id) local numOfAvatars = Space.Scene.ConnectedAvatars for num =1 , numOfAvatars, 1 do Space.Log(Space.Scene.Avatars[num].Username) end end ``` ##### Title[​](#title "Direct link to Title") string **Title** `get` *Avatar's Title* * Lua ```lua ID = Space.Scene.Avatars[1].Title ``` * Lua ```lua --server script that prints a list of Titles of players online whenever someone joins function OnAvatarJoin(id) local numOfAvatars = Space.Scene.ConnectedAvatars for num =1 , numOfAvatars, 1 do Space.Log(Space.Scene.Avatars[num].Title) end end ``` --- ### SCell #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function | | -------------------------------------------------------------------------------------------------------- | | SObject [**GetObject** ](/scripting/server-scripting-api-reference/region/scell.md#getobject)(string id) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property | | -------------------------------------------------------------------------------------------- | | Table [**Objects** ](/scripting/server-scripting-api-reference/region/scell.md#objects)`get` | #### Functions[​](#functions "Direct link to Functions") ##### GetObject[​](#getobject "Direct link to GetObject") [SObject](/scripting/server-scripting-api-reference/region/sobject.md) **GetObject** (string id) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` #### Properties[​](#properties "Direct link to Properties") ##### Objects[​](#objects "Direct link to Objects") Table **Objects** `get` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` --- ### SObject #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function | | ------------------------------------------------------------------------------------------------------------------------------- | | string [**GetProperty** ](/scripting/server-scripting-api-reference/region/sobject.md#getproperty)(string property) | | void [**SetProperty** ](/scripting/server-scripting-api-reference/region/sobject.md#setproperty)(string property, string value) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property | | ----------------------------------------------------------------------------------------------------------- | | SCell [**Cell** ](/scripting/server-scripting-api-reference/region/sobject.md#cell)`get` | | string [**ID**](/scripting/server-scripting-api-reference/region/sobject.md#id) `get` | | string [**Floor** ](/scripting/server-scripting-api-reference/region/sobject.md#floor)`get` | | Vector3 [**Position** ](/scripting/server-scripting-api-reference/region/sobject.md#position)`get` `set` | | Quaternion [**Rotation** ](/scripting/server-scripting-api-reference/region/sobject.md#rotation)`get` `set` | | Vector3 [**Scale** ](/scripting/server-scripting-api-reference/region/sobject.md#scale)`get` `set` | | int [**Player** ](/scripting/server-scripting-api-reference/region/sobject.md#player)`get` | | int [**InventoryID** ](/scripting/server-scripting-api-reference/region/sobject.md#inventoryid)`get` | | int [**ItemID** ](/scripting/server-scripting-api-reference/region/sobject.md#itemid)`get` | | Bounds [**Bounds** ](/scripting/server-scripting-api-reference/region/sobject.md#bounds)`get` | #### Functions[​](#functions "Direct link to Functions") ##### GetProperty[​](#getproperty "Direct link to GetProperty") string **GetProperty** (string property) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` ##### SetProperty[​](#setproperty "Direct link to SetProperty") void **SetProperty** (string property, string value) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` #### Properties[​](#properties "Direct link to Properties") ##### Cell[​](#cell "Direct link to Cell") SCell **Cell** `get` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` ##### ID[​](#id "Direct link to ID") string **ID** `get` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` ##### Floor[​](#floor "Direct link to Floor") string **Floor** `get` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` ##### Position[​](#position "Direct link to Position") Vector3 **Position** `get` `set` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` ##### Rotation[​](#rotation "Direct link to Rotation") Quaternion **Rotation** `get` `set` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` ##### Scale[​](#scale "Direct link to Scale") Vector3 **Scale** `get` `set` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` ##### Player[​](#player "Direct link to Player") int **Player** `get` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` ##### InventoryID[​](#inventoryid "Direct link to InventoryID") int **InventoryID** `get` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` ##### ItemID[​](#itemid "Direct link to ItemID") int **ItemID** `get` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` ##### Bounds[​](#bounds "Direct link to Bounds") Bounds **Bounds** `get` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` --- ### SParcel #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property | | ---------------------------------------------------------------------------------------------------------------- | | string [**ID**](/scripting/server-scripting-api-reference/region/sparcel.md#id) `get` | | string [**Name** ](/scripting/server-scripting-api-reference/region/sparcel.md#name)`get` | | string [**DescriptionName** ](/scripting/server-scripting-api-reference/region/sparcel.md#descriptionname)`get` | | bool [**ForSale** ](/scripting/server-scripting-api-reference/region/sparcel.md#forsale)`get` | | int [**GoldSalePrice** ](/scripting/server-scripting-api-reference/region/sparcel.md#goldsaleprice)`get` | | int [**SilverSalePrice** ](/scripting/server-scripting-api-reference/region/sparcel.md#silversaleprice)`get` | | int [**GoldRentalPrice** ](/scripting/server-scripting-api-reference/region/sparcel.md#goldrentalprice)`get` | | int [**SilverRentalPrice** ](/scripting/server-scripting-api-reference/region/sparcel.md#silverrentalprice)`get` | #### Properties[​](#properties "Direct link to Properties") ##### ID[​](#id "Direct link to ID") string **ID** `get` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` ##### Name[​](#name "Direct link to Name") string **Name** `get` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` ##### DescriptionName[​](#descriptionname "Direct link to DescriptionName") string **DescriptionName** `get` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` ##### ForSale[​](#forsale "Direct link to ForSale") bool **ForSale** `get` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` ##### GoldSalePrice[​](#goldsaleprice "Direct link to GoldSalePrice") int **GoldSalePrice** `get` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` ##### SilverSalePrice[​](#silversaleprice "Direct link to SilverSalePrice") int **SilverSalePrice** `get` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` ##### GoldRentalPrice[​](#goldrentalprice "Direct link to GoldRentalPrice") int **GoldRentalPrice** `get` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` ##### SilverRentalPrice[​](#silverrentalprice "Direct link to SilverRentalPrice") int **SilverRentalPrice** `get` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` --- ### SParcelManager #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function | | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [SParcel](/scripting/server-scripting-api-reference/region/sparcel.md) [**GetParcel** ](/scripting/server-scripting-api-reference/region/sparcelmanager.md#getparcel)(string id) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property | | ----------------------------------------------------------------------------------------------------------- | | Table [**AllParcels** ](/scripting/server-scripting-api-reference/region/sparcelmanager.md#allparcels)`get` | #### Functions[​](#functions "Direct link to Functions") ##### GetParcel[​](#getparcel "Direct link to GetParcel") SParcel **GetParcel** (string id) *Function Description* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` #### Properties[​](#properties "Direct link to Properties") ##### AllParcels[​](#allparcels "Direct link to AllParcels") Table **AllParcels** `get` *Property Description* * Lua ```lua example 1 ``` * Lua ```lua example 2 ``` --- ### SRegionScript #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function | | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | void [**Log** ](/scripting/server-scripting-api-reference/region/sregionscript.md#log)(string message) | | void [**SubscribeToNetwork** ](/scripting/server-scripting-api-reference/region/sregionscript.md#subscribetonetwork)(string key) | | void [**UnsubscribeFromNetwork** ](/scripting/server-scripting-api-reference/region/sregionscript.md#unsubscribefromnetwork)(string key) | | void [**SendMessageToAllClientScripts** ](/scripting/server-scripting-api-reference/region/sregionscript.md#sendmessagetoallclientscripts)(string messageName, Table message) | | void [**SendMessageToClientScripts** ](/scripting/server-scripting-api-reference/region/sregionscript.md#sendmessagetoclientscripts)(ulong playerID, string messageName, Table message) | | void [**StartCoroutine** ](sregionscript#startcoroutine)(DynValue coroutine, DynValue parameter=default(DynValue))
void [**StartCoroutine** ](sregionscript#startcoroutine)(string name, DynValue parameter=default(DynValue)) | ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property | | ------------------------------------------------------------------------------------------------------------------ | | string [**ScriptID** ](/scripting/server-scripting-api-reference/region/sregionscript.md#scriptid)`get` | | uint [**InstanceID** ](/scripting/server-scripting-api-reference/region/sregionscript.md#instanceid)`get` | | ulong [**RegionID** ](/scripting/server-scripting-api-reference/region/sregionscript.md#regionid)`get` | | SScene [**Scene** ](/scripting/server-scripting-api-reference/region/sregionscript.md#scene)`get` | | SDatabase [**Database** ](/scripting/server-scripting-api-reference/region/sregionscript.md#database)`get` | | SMath [**Math** ](/scripting/server-scripting-api-reference/region/sregionscript.md#math)`get` | | SShared [**Shared** ](/scripting/server-scripting-api-reference/region/sregionscript.md#shared)`get` | | SWebservice [**WebServices** ](/scripting/server-scripting-api-reference/region/sregionscript.md#webservices)`get` | | string [**RuntimeType** ](/scripting/server-scripting-api-reference/region/sregionscript.md#runtimetype)`get` | | bool [**InEditor** ](/scripting/server-scripting-api-reference/region/sregionscript.md#ineditor)`get` | | float [**TimeSinceAwake** ](/scripting/server-scripting-api-reference/region/sregionscript.md#timesinceawake)`get` | | string [**DateTimeUTC** ](/scripting/server-scripting-api-reference/region/sregionscript.md#datetimeutc)`get` | | int [**LocalTimeUnix** ](/scripting/server-scripting-api-reference/region/sregionscript.md#localtimeunix)`get` | | int [**ServerTimeUnix** ](/scripting/server-scripting-api-reference/region/sregionscript.md#servertimeunix)`get` | ##### Events Index[​](#events-index "Direct link to Events Index") | Event | | -------------------------------------------------------------------------------------------------------------------------------------------- | | Action< int > [**OnAvatarJoin**](/scripting/server-scripting-api-reference/region/sregionscript.md#onavatarjoin) | | Action< int > [**OnAvatarLeave**](/scripting/server-scripting-api-reference/region/sregionscript.md#onavatarleave) | | Action< string, Table > [**OnScriptServerMessage**](/scripting/server-scripting-api-reference/region/sregionscript.md#onscriptservermessage) | #### Functions[​](#functions "Direct link to Functions") ##### Log[​](#log "Direct link to Log") void **Log** (string message) *Log a message to console. (only works on preview grid)* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.Log("Log") ``` * Lua ```lua --Clicking the object will make the server script log "Test Message" on all clients --server script function OnScriptServerMessage(key, table) if key == "testKey" then Space.Log("Message:" .. table[1]) end end --client script thisObject = Space.Host.ExecutingObject OnClickFunction = function() Space.Network.SendNetworkMessage("testKey",{"Test Message"}) end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### SubscribeToNetwork[​](#subscribetonetwork "Direct link to SubscribeToNetwork") void **SubscribeToNetwork** (string key) *Subscribe to network messages on "key".* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.SubscribeToNetwork("thekey") ``` ##### UnsubscribeFromNetwork[​](#unsubscribefromnetwork "Direct link to UnsubscribeFromNetwork") void **UnsubscribeFromNetwork** (string key) *Unsubscribe from network messages on "key".* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.UnsubscribeFromNetwork("thekey") ``` ##### SendMessageToAllClientScripts[​](#sendmessagetoallclientscripts "Direct link to SendMessageToAllClientScripts") void **SendMessageToAllClientScripts** (string messageName, Table message) *Sends a network message to all client scripts.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.SendMessageToAllClientScripts("thekey",{"themessage"}) ``` * Lua ```lua --Clicking the object by a single client will send a message to the server which triggers a message response to all clients --server script-- function OnScriptServerMessage(key, table) if key == "testKey" then Space.SendMessageToAllClientScripts("ServerResponse",{"message response to all client scripts in region that are subscribed to this key"}) end end --client script-- thisObject = Space.Host.ExecutingObject OnClickFunction = function() Space.Network.SendNetworkMessage("testKey",{"Test Message"}) end OnReceiveFunction = function(SNetworkMessage) Space.Log(SNetworkMessage.Key) Space.Log(SNetworkMessage.Message[1]) end Space.Network.SubscribeToNetwork("ServerResponse", OnReceiveFunction) thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### SendMessageToClientScripts[​](#sendmessagetoclientscripts "Direct link to SendMessageToClientScripts") void **SendMessageToClientScripts** (ulong playerID, string messageName, Table message) *Sends a network message to a client script belonging to a specific player* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.SendMessageToClientScripts(playerID,"thekey",{"themessage"}) ``` * Lua ```lua --Clicking the object by a single client will send a message to the server which triggers... --a message response only to that specific client --server script-- function OnScriptServerMessage(key, table) if key == "testKey" then local sender = table[2] Space.SendMessageToClientScripts(sender,"ServerResponse",{"a message response to the clicker's client script in region that is subscribed to this key"}) end end --client script-- thisObject = Space.Host.ExecutingObject OnClickFunction = function() id = Space.Scene.PlayerAvatar.ID Space.Network.SendNetworkMessage("testKey",{"Test Message", id}) end OnReceiveFunction = function(SNetworkMessage) Space.Log(SNetworkMessage.Key) Space.Log(SNetworkMessage.Message[1]) end Space.Network.SubscribeToNetwork("ServerResponse", OnReceiveFunction) thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### StartCoroutine[​](#startcoroutine "Direct link to StartCoroutine") void **StartCoroutine** (DynValue coroutine, DynValue parameter=default(DynValue))
void **StartCoroutine** (string name, DynValue parameter=default(DynValue)) *Runs the given function as a coroutine. A parameter is optional.* | Parameter | Type | Description | | --------- | ---- | ----------- | | | | | * Lua ```lua Space.StartCoroutine(AFunctionName) ``` * Lua ```lua --Clicking the object on client will trigger a 3 second countdown on server script using coroutine --server script-- function OnScriptServerMessage(key, table) if key == "testKey" and table[1] == "Timer" then Space.StartCoroutine(TimerCoroutine) end end function TimerCoroutine() local time = 0 while time < 3 do Space.Log(3-time) time = time + 1 coroutine.yield(1) end end --client script-- thisObject = Space.Host.ExecutingObject function OnClickFunction() Space.Network.SendNetworkMessage("testKey",{"Timer"}) end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` #### Properties[​](#properties "Direct link to Properties") ##### ScriptID[​](#scriptid "Direct link to ScriptID") string **ScriptID** `get` *Returns a unique identifier of this script runtime. (can be found in "/list\_scripts" window on preview.)* * Lua ```lua scriptID = Space.ScriptID ``` * Lua ```lua --Clicking the object on client will make the server script log it's ScriptID --server script-- function OnScriptServerMessage(key, table) if key == "testKey" and table[1] == "ScriptID" then Space.Log(Space.ScriptID) end end --client script-- thisObject = Space.Host.ExecutingObject function OnClickFunction() Space.Network.SendNetworkMessage("testKey",{"ScriptID"}) end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### InstanceID[​](#instanceid "Direct link to InstanceID") uint **InstanceID** `get` *Returns a unique identifier for the instance of the region. Useful in the case of multiple shards/instances being used. InstanceID does not necessarily equal to the RegionID, even if there's only one instance running.* * Lua ```lua instance = Space.InstanceID ``` * Lua ```lua --Clicking the object on client will make the server script log only... --if it's instanceID matches with client's instanceID --server script-- function OnScriptServerMessage(key, table) local instanceID = Space.InstanceID if key == "testKey" and table[1] == "ScriptID" and table[2] == instanceID then Space.Log(instanceID) end end --client script-- thisObject = Space.Host.ExecutingObject function OnClickFunction() local instanceID = Space.Scene.InstanceID Space.Network.SendNetworkMessage("testKey",{"ScriptID", instanceID}) end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### RegionID[​](#regionid "Direct link to RegionID") ulong **RegionID** `get` *Returns a unique identifier for the region. (Same ID seen in curator)* * Lua ```lua region = Space.RegionID ``` * Lua ```lua --Clicking the object on client will make the server script log only... --if it's RegionID matches with client's RegionID --server script-- function OnScriptServerMessage(key, table) local RegionID = Space.RegionID if key == "testKey" and table[1] == "ScriptID" and table[2] == RegionID then Space.Log(RegionID) end end --client script-- thisObject = Space.Host.ExecutingObject function OnClickFunction() local RegionID = Space.Scene.RegionID Space.Network.SendNetworkMessage("testKey",{"ScriptID", RegionID}) end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### Scene[​](#scene "Direct link to Scene") [SScene](/scripting/server-scripting-api-reference/region/sscene.md) **Scene** `get` *Access to the SScene class methods and properties.* * Lua ```lua Space.Scene ``` ##### Database[​](#database "Direct link to Database") [SDatabase](/scripting/server-scripting-api-reference/storage/sdatabase.md) **Database** `get` *Access to the SDatabase class methods and properties.* * Lua ```lua Space.Database ``` ##### Math[​](#math "Direct link to Math") [SMath](/scripting/server-scripting-api-reference/library/smath.md) **Math** `get` *Access to the SMath class methods and properties.* * Lua ```lua Space.Math ``` ##### Shared[​](#shared "Direct link to Shared") [SShared](/scripting/server-scripting-api-reference/network/sshared.md) **Shared** `get` *Access to the SShared class methods and properties.* * Lua ```lua Space.Shared ``` ##### WebServices[​](#webservices "Direct link to WebServices") [SWebservice](/scripting/server-scripting-api-reference/network/swebservice.md) **WebServices** `get` *Access to the SWebservice class methods and properties.* * Lua ```lua Space.WebServices ``` ##### RuntimeType[​](#runtimetype "Direct link to RuntimeType") string **RuntimeType** `get` *Returns "Server" if this script is a Server script* * Lua ```lua type = Space.RuntimeType ``` ##### InEditor[​](#ineditor "Direct link to InEditor") bool **InEditor** `get` *Returns true if in Editor. (this will return false on server scripts)* * Lua ```lua IsInEditor = Space.InEditor ``` ##### TimeSinceAwake[​](#timesinceawake "Direct link to TimeSinceAwake") float **TimeSinceAwake** `get` *Time, in seconds, since this script runtime has been awake.* * Lua ```lua SecondsAwake = Space.TimeSinceAwake ``` * Lua ```lua --Clicking the object will make the server script log it's TimeSinceAwake on all clients --server script function OnScriptServerMessage(key, table) if key == "testKey" and table[1] == "TimeSinceAwake" then Space.Log(Space.TimeSinceAwake) end end --client script thisObject = Space.Host.ExecutingObject OnClickFunction = function() Space.Network.SendNetworkMessage("testKey",{"TimeSinceAwake"}) end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### DateTimeUTC[​](#datetimeutc "Direct link to DateTimeUTC") string **DateTimeUTC** `get` *Returns a string of the current Date/Time in UTC* * Lua ```lua DateAndTime = Space.DateTimeUTC ``` * Lua ```lua --Clicking the object will make the server script log it's DateTimeUTC on all clients --server script function OnScriptServerMessage(key, table) if key == "testKey" and table[1] == "DateTimeUTC" then Space.Log(Space.DateTimeUTC) end end --client script thisObject = Space.Host.ExecutingObject OnClickFunction = function() Space.Network.SendNetworkMessage("testKey",{"DateTimeUTC"}) end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### LocalTimeUnix[​](#localtimeunix "Direct link to LocalTimeUnix") int **LocalTimeUnix** `get` *Returns the current Unix time (in seconds) (same as ServerTimeUnix)* * Lua ```lua unixtime = Space.LocalTimeUnix ``` * Lua ```lua --Clicking the object will make the server script log it's LocalTimeUnix on all clients --server script function OnScriptServerMessage(key, table) if key == "testKey" and table[1] == "LocalTimeUnix" then Space.Log(Space.LocalTimeUnix) end end --client script thisObject = Space.Host.ExecutingObject OnClickFunction = function() Space.Network.SendNetworkMessage("testKey",{"LocalTimeUnix"}) end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` ##### ServerTimeUnix[​](#servertimeunix "Direct link to ServerTimeUnix") int **ServerTimeUnix** `get` *Returns the current Unix time (in seconds) (same as LocalTimeUnix)* * Lua ```lua unixtime = Space.ServerTimeUnix ``` * Lua ```lua --Clicking the object will make the server script log it's ServerTimeUnix on all clients --server script function OnScriptServerMessage(key, table) if key == "testKey" and table[1] == "ServerTimeUnix" then Space.Log(Space.ServerTimeUnix) end end --client script thisObject = Space.Host.ExecutingObject OnClickFunction = function() Space.Network.SendNetworkMessage("testKey",{"ServerTimeUnix"}) end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` #### Events[​](#events "Direct link to Events") ##### OnAvatarJoin[​](#onavatarjoin "Direct link to OnAvatarJoin") Action< int > **OnAvatarJoin** *An event function which will be called whenever an Avatar joins and will also contain the Avatar's ID as a parameter.* * Lua ```lua function OnAvatarJoin(playerID) end ``` * Lua ```lua function OnAvatarJoin(id) local numOfAvatars = Space.Scene.ConnectedAvatars Space.Log("Avatar with ID " .. id .. "has joined") Space.Log("Number of avatars connected: " .. numOfAvatars) end ``` ##### OnAvatarLeave[​](#onavatarleave "Direct link to OnAvatarLeave") Action< int > **OnAvatarLeave** *An event function which will be called whenever an Avatar leaves and will also contain the Avatar's ID as a parameter.* * Lua ```lua function OnAvatarLeave(playerID) end ``` * Lua ```lua function OnAvatarLeave(id) local numOfAvatars = Space.Scene.ConnectedAvatars Space.Log("Avatar with ID " .. id .. "has left") Space.Log("Number of avatars connected: " .. numOfAvatars) end ``` ##### OnScriptServerMessage[​](#onscriptservermessage "Direct link to OnScriptServerMessage") Action< string, Table > **OnScriptServerMessage** *An event function which will be called whenever the server script receives a Network Message, and will contain the network message key String and message Table as a parameter.* * Lua ```lua function OnScriptServerMessage(key, table) theKeyString = key theSNetworkMessageTable = table end ``` * Lua ```lua --Clicking the object will make the server script log "Test Message" on all clients --server script function OnScriptServerMessage(key, table) if key == "testKey" then Space.Log("Message:" .. table[1]) end end --client script thisObject = Space.Host.ExecutingObject OnClickFunction = function() Space.Network.SendNetworkMessage("testKey",{"Test Message"}) end thisObject.AddClickable() thisObject.Clickable.OnClick(OnClickFunction) ``` --- ### SScene #### Index[​](#index "Direct link to Index") ##### Properties Index[​](#properties-index "Direct link to Properties Index") | Property | | ------------------------------------------------------------------------------------------------------------- | | int [**ConnectedAvatars** ](/scripting/server-scripting-api-reference/region/sscene.md#connectedavatars)`get` | | Table [**Avatars** ](/scripting/server-scripting-api-reference/region/sscene.md#avatars)`get` | | Table [**Cells** ](/scripting/server-scripting-api-reference/region/sscene.md#cells)`get` | | SParcelManager [**Parcels** ](/scripting/server-scripting-api-reference/region/sscene.md#parcels)`get` | #### Properties[​](#properties "Direct link to Properties") ##### ConnectedAvatars[​](#connectedavatars "Direct link to ConnectedAvatars") int **ConnectedAvatars** `get` *Returns the number of Avatars connected to the region.* * Lua ```lua numOfAvatars = Space.Scene.ConnectedAvatars ``` * Lua ```lua function OnAvatarJoin(id) local numOfAvatars = Space.Scene.ConnectedAvatars Space.Log("Avatar with ID " .. id .. "has joined") Space.Log("Number of avatars connected: " .. numOfAvatars) end ``` ##### Avatars[​](#avatars "Direct link to Avatars") Table **Avatars** `get` *Returns a table of SAvatar objects currently in the region* * Lua ```lua currentAvatars = Space.Scene.Avatars ``` ##### Cells[​](#cells "Direct link to Cells") Table **Cells** `get` *Returns a table of SCell objects. (Not all cells are available at all times, a client on this server must be within 384m of a cell in order for it to exist.)* * Lua ```lua cellsTable = Space.Scene.Cells ``` ##### Parcels[​](#parcels "Direct link to Parcels") [SParcelManager](/scripting/server-scripting-api-reference/region/sparcelmanager.md) **Parcels** `get` *Access to the SParcelManager class.* * Lua ```lua Space.Scene.Parcels ``` --- ### Storage Persistent server-side storage for your region, including the database API for saving and querying data. --- ### SDatabase #### Index[​](#index "Direct link to Index") ##### Functions Index[​](#functions-index "Direct link to Functions Index") | Function | | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | | void [**GetRegionValue** ](/scripting/server-scripting-api-reference/storage/sdatabase.md#getregionvalue)(string key, Closure onResult) | | void [**SetRegionValue** ](/scripting/server-scripting-api-reference/storage/sdatabase.md#setregionvalue)(string key, string value, Closure onSave) | | void [**GetPlayerValue** ](/scripting/server-scripting-api-reference/storage/sdatabase.md#getplayervalue)(int player, string key, Closure onResult) | | void [**SetPlayerValue** ](/scripting/server-scripting-api-reference/storage/sdatabase.md#setplayervalue)(int player, string key, string value, Closure onSave) | #### Functions[​](#functions "Direct link to Functions") ##### GetRegionValue[​](#getregionvalue "Direct link to GetRegionValue") void **GetRegionValue** (string key, Closure onResult) *Get a value stored in the region database. (this does not access the same database as the SPersistence class)* | Parameter | Type | Description | | --------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | key | string | The "key" to access the record from the region database. | | onResult | Closure | The name of the function which will be called once the results are ready.
This function will be called with a string parameter containing the requested value. onResult(value) | * Lua ```lua function onResult(value) yourValue = value end Space.Database.GetRegionValue("testKey", onResult) ``` ##### SetRegionValue[​](#setregionvalue "Direct link to SetRegionValue") void **SetRegionValue** (string key, string value, Closure onSave) *Store a "value" in the region database. (this does not access the same database as the SPersistence class)* | Parameter | Type | Description | | --------- | ------- | ------------------------------------------------------------------------------------------------------ | | key | string | The "key" to access the record from the region database. | | value | string | The "value" that will be stored in the region database. | | onSave | Closure | The name of the function which will be called when the "value" has been stored in the region database. | * Lua ```lua function onSave() -- end Space.Database.SetRegionValue("testKey", "testValue", onSave) ``` ##### GetPlayerValue[​](#getplayervalue "Direct link to GetPlayerValue") void **GetPlayerValue** (int player, string key, Closure onResult) *Get a value stored in a player database. (this does not access the same database as the SPersistence class)* | Parameter | Type | Description | | --------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | player | int | The ID of the player's database in whose record we will access. | | key | string | The "key" to access the record from the region database. | | onResult | Closure | The name of the function which will be called once the results are ready.
This function will be called with a string parameter containing the requested value. onResult(value) | * Lua ```lua function onResult(value) yourValue = value end Space.Database.GetPlayerValue(aPlayerID,"testKey",onResult) ``` ##### SetPlayerValue[​](#setplayervalue "Direct link to SetPlayerValue") void **SetPlayerValue** (int player, string key, string value, Closure onSave) *Store a "value" in a player database. (this does not access the same database as the SPersistence class). (this does not access the same database as the SPersistence class)* | Parameter | Type | Description | | --------- | ------- | ------------------------------------------------------------------------------------------------------ | | player | int | The ID of the player's database in whose record we will access. | | key | string | The "key" to access the record from the region database. | | onSave | Closure | The name of the function which will be called when the "value" has been stored in the player database. | * Lua ```lua function onSave() -- end Space.Database.SetPlayerValue(aPlayerID,"testKey", "testValue",onSave) ``` --- ### Support #### [πŸ“„οΈReport An Issue](/scripting/support/report-an-issue.md) [How to report issues within the Sinespace Scripting Documentation](/scripting/support/report-an-issue.md) --- ### Report An Issue ##### How to report an issue with this documentation[​](#how-to-report-an-issue-with-this-documentation "Direct link to How to report an issue with this documentation") If you would like to report any issues with this documentation such as corrections, lack of documentation, or improvements in the quality, please use [this form ](https://form.asana.com/?k=foybfPQQIK5JpFVRRcPyJg\&d=634886966090241)and select **Scripting** as the type of documentation. --- ## Sinespace Api ### Sinespace API #### [πŸ“„οΈRegistration & Grid API](/sinespace-api/gridapi.md) [This API requires specific access to be granted to your account. If you have purchased your own Grid, this will be automatically enabled on the primary user account.](/sinespace-api/gridapi.md) --- ### Registration & Grid API #### Overview[​](#overview "Direct link to Overview") This API requires specific access to be granted to your account. If you have purchased your own Grid, this will be automatically enabled on the primary user account. info You may send parameters as either POST form\_data, or as Query parameters on the URL. tip **All APIs require you send three additional POST parameters** - `adminname, adminpwd,`and `gridid`, these should be the username, and password of an account on the Grid with administrator rights, along with the grid you wish to interface with. We recommend creating a new user for this role specifically. #### User Management APIs[​](#user-management-apis "Direct link to User Management APIs") #### Register User[​](#register-user "Direct link to Register User") *`POST`* `https://sine.space/worldapi/externalapi/add_user` This endpoint allows you to register new users automatically. ###### Query Parameters[​](#query-parameters "Direct link to Query Parameters") | Name | Type | Description | | -------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | gridid | integer | The unique grid ID to register the user on. | | password | string | The users initial password | | email | string | The users email address. We will not send any messages to this address unless requested by the user (e.g. password reset) | | username | string | The desired username for the user | | playeroutfitid | integer | The "Outfit ID" the user should be wearing when they first log in. As this creates 'free' copies of items that may be paid items in our marketplace, the creator of the items must be an administrator of the grid in question. | * 200 User account has been created * 400 Bad or invalid input, or similar. ```text 2099396 ``` ```text 0A user account with that name already exists. ``` #### Delete User[​](#delete-user "Direct link to Delete User") *`POST`* `https://sine.space/worldapi/externalapi/delete_user` Deletes or disables a user account ###### Path Parameters[​](#path-parameters "Direct link to Path Parameters") | Name | Type | Description | | ------ | ------- | -------------------------------------- | | userid | integer | The user ID associated with this user. | * 200 ```text 1 ``` #### Update User[​](#update-user "Direct link to Update User") *`POST`* `https://sine.space/worldapi/externalapi/update_user` Changes information about a user account ###### Query Parameters[​](#query-parameters-1 "Direct link to Query Parameters") | Name | Type | Description | | -------- | ------- | -------------------------------------- | | userid | integer | The user ID associated with this user. | | email | string | Updates the users email address | | password | string | Updates the users password | * 200 ```text 1 ``` #### Get Users[​](#get-users "Direct link to Get Users") *`POST`* `https://sine.space/worldapi/externalapi/get_users` Returns a bulk list of users associated with the Grid ###### Query Parameters[​](#query-parameters-2 "Direct link to Query Parameters") | Name | Type | Description | | ------- | ------- | -------------------------------------------------------------------------------------------------------------- | | userids | string | A comma separated list of user IDs you are interested in information about. | | offset | integer | The query will return a maximum of 100 records, if more are available, use 'offset' to return past this point. | * 200 ```text 2099560usernameusername@test1.comM2099559username2username2@test1.comF ``` #### Get User By Email[​](#get-user-by-email "Direct link to Get User By Email") *`POST`* `https://sine.space/worldapi/externalapi/get_user_by_email` Retrieves information about an individual user via their email address ###### Query Parameters[​](#query-parameters-3 "Direct link to Query Parameters") | Name | Type | Description | | ----- | ------ | --------------------------------------------- | | email | string | The email address associated with the account | * 200 ```text 2099560usernameusername@test1.comM ``` #### Update Login Region[​](#update-login-region "Direct link to Update Login Region") *`POST`* `https://sine.space/worldapi/externalapi/update_login_region` Updates the user, sets their login scene to the specified ID. ###### Query Parameters[​](#query-parameters-4 "Direct link to Query Parameters") | Name | Type | Description | | -------- | ------- | ------------------------------------------------------------------------------ | | userid | integer | The user to updates user ID | | regionid | integer | The scene to make as their login scene. Set to zero to return to grid default. | * 200 ```text 1 ``` #### Region APIs[​](#region-apis "Direct link to Region APIs") #### Create Region[​](#create-region "Direct link to Create Region") *`POST`* `https://sine.space/worldapi/externalapi/create_region` Creates a new region on the grid ###### Query Parameters[​](#query-parameters-5 "Direct link to Query Parameters") | Name | Type | Description | | ----------- | ------- | --------------------------------------------------------------------------------------------------------------------- | | owner | integer | The user ID to be marked as owner of the region | | templateid | integer | The item ID for the region template to use | | accesslevel | integer | Either "0" for no access, "1" for free-for-all access, "2" for friends-only access, and "3" for approved only access. | | regionname | string | The name of the region you wish to create | * 200 Region was created successfully * 400 An error was found in the inputs ```text 152860 ``` ```text 0Room template not available, please try another. ``` #### Set Region Role[​](#set-region-role "Direct link to Set Region Role") *`POST`* `https://sine.space/worldapi/externalapi/set_region_role` ###### Query Parameters[​](#query-parameters-6 "Direct link to Query Parameters") | Name | Type | Description | | -------- | ------- | --------------------------------------- | | regionid | integer | The ID of the region | | userid | integer | The ID of the user in question | | role | string | Either "Normal", "Admin", or "Blocked". | * 200 * 400 ```text 1 ``` ```text 0The data provided is incorrect: role = abc ``` #### Get Regions[​](#get-regions "Direct link to Get Regions") *`POST`* `https://sine.space/worldapi/externalapi/get_regions` Requests a list of regions on the Grid ###### Query Parameters[​](#query-parameters-7 "Direct link to Query Parameters") | Name | Type | Description | | --------- | ------- | --------------------------------------------------------------------- | | offset | integer | Offsets the results if there is too many to return in a single query. | | owner | integer | Return regions owned by this account | | regionids | string | A CSV separated list of region IDs to return information about. | * 200 ```text 50000040regionname209956411350000039regionname22099563111 ``` #### Update Region[​](#update-region "Direct link to Update Region") *`POST`* `https://sine.space/worldapi/externalapi/update_region` Updates information about a particular region ###### Query Parameters[​](#query-parameters-8 "Direct link to Query Parameters") | Name | Type | Description | | ----------- | ------- | ------------------------------------------------------------------------------------------------- | | regionid | integer | The region ID to update information about | | regionname | string | If present, changes the name of the region | | templateid | integer | If present, changes the template of the region to the specified template ID | | accesslevel | integer | Either "0" - no access, "1" - free access, "2" friends-only access, and "3" approved only access. | * 200 ```text 1 ``` --- ## Sinespace Sdk ### Sinespace SDK #### [πŸ—ƒAnimation](/sinespace-sdk/animation/animation-production-workflow.md) [1 item](/sinespace-sdk/animation/animation-production-workflow.md) --- ### Animation Production Workflow #### Overview[​](#overview "Direct link to Overview") A zero-cost animation production workflow. A zero-cost animation production workflow. This is FAIRLY EXPERIMENTAL, please do update if possible! Animation production for Sine Space has been a bit of a neglected topic. Here is a fresh end-to-end process and toolchain for getting animations/poses together for your furniture, vehicles, and etc. ###### The Toolchain and Process[​](#the-toolchain-and-process "Direct link to The Toolchain and Process") 1\. QAvimator ([\[1\]](http://qavimator.org/)) This older opensource application does one thing and one thing only, and does it fairly well. It allows you to pose an avatar model for keyframes on a timeline, and output the resulting humanoid animation as both a proprietary file and as a mocap motion file (BVH). Version 0.1.1.426 on Windows 10 is being used in this workflow. We wont get into how to use QAvimator; it is simple, and if you've ever made a paper flipbook and used a computer, you should not have a problem working out how to use QAvimator. One note though regarding storage: It'll try and save to the directory in 'Programs (x86)' where the executable lives. That's bad. That way lies madness. Make a data directory somewhere and use it. 2\. Blender ([\[2\]](http://blender.org/)) Blender is exactly the opposite of QAvimator in scope; it does \*everything\*. Including provide for the production of animations. However, blender is a highly complex tool with a steep learning curve and a user interface made by aliens from alpha centauri, so we will use it only for converting from BVH to FBX. Blender version 2.78 is being used in this workflow. Doing so is fairly straightforward: Click 'File->Import->Motion Capture(.BVH)'. You should not need to tweak any settings here; just import it according to the defaults. Next, export it as FBX (File->Export->FBX(.fbx)). If you've never used blender, pay careful attention to the file saving dialog, it's a bit different. I'd recommend fiddling with it a bit and gathering some confidence that my files were being saved. 3\. Unity/Space Finally, we're getting the animation into Space. This is where the important tweaks come into play. The process is not unlike that of importing any other FBX, excpet for a few notable ddifferences. First, you'll want to click 'Assets->Import Asset...'. This will take you into the file selector dialog; browse to your data directory (you did make one and use it, yes?) and select the FBX version of your animation saved from blender in the previous step. Your FBX is imported now, but there are various tweaks that need be applied to get it into a proper working state for Space. First, click the 'Rig' tab on the import properties pane. Set the anim type as 'Humanoid'. Click apply. On the 'Model' tab, untick 'Use File Scale'. Click the Apply button. You should be set; there will be a folder generated in your unity project's assets named after the file you imported. Within that will be the clip(s) (animations). These should be ready to use in your vehicle furniture sits or animation controllers in Space. Good luck and happy animating! ANIMATE ALL THE THINGS!! --- ### Animation Tools #### Overview[​](#overview "Direct link to Overview") A brief survey of various tools with humanoid avatar animation capability There are a variety of solutions available for producing humanoid animations, both paid and free. A brief survey of various tools with humanoid avatar animation capability There are a variety of solutions available for producing humanoid animations, both paid and free. We'll accumulate a list here, and hopefully everyone with the knowledge can pitch in with instructions, pointers and tips. ###### The Tools[​](#the-tools "Direct link to The Tools") 1\. QAvimator ([\[1\]](http://qavimator.org/)) This older opensource application does one thing and one thing only, and does it fairly well. It allows you to pose an avatar model for keyframes on a timeline, and output the resulting humanoid animation as both a proprietary file and as a mocap motion file (BVH). Version 0.1.1.426 is what has been used successfully with Unity/Space so far. QAvimator has a fairly intuitive interface developed on Troll-Tech's Qt interface library. It's quite well utilised, resulting in a highly interactive tool with a small executable footprint. Because it was developed on relatively old computers, it isn't very thread heavy and will cheerfully run several copies at once. The interface loves to get clicked. Click and drag on the background in the scene to move the camera; click on body parts to select them for positioning. Drag the sliders around to change the position and orientation of whatever bodypart is selected. When you start an animation, never use the first frame. The animator uses that for stuff. Otherwise, clicking to the right of a bodypart listed on the timeline graph will also select that bodypart, at that point on the graph. Any bodypart, once selected, can have it's current position and orientation changed via the sliders. On the lower right, beneath the sliders, are various parameters pertaining to the actual animation clip, e.g., number of frames and frames per second. Adjust these according to your needs. There is support for a range of props and prop workflows in this version, but these came a bit after my time and so I will leave it to you all or perhaps another time to describe that set of tools and techniques. 2\. Blender ([\[2\]](http://blender.org/)) 3\. Poser 4\. DAZ Studio 5\. 3DS/MAX 6\. Maya 7\. AVASTAR 8\. Photoshop 9\. Mechanim --- ### Clothing #### Overview[​](#overview "Direct link to Overview") Welcome to the Clothing Portal! Sinespace has some powerful tools when it comes to creating clothing. ![](/assets/images/962px-clothingportalbanner-61fb8871a2e4ac2af2694cf8918a2f93.jpg) #### Welcome to the Clothing Portal\![​](#welcome-to-the-clothing-portal "Direct link to Welcome to the Clothing Portal!") Sinespace has some powerful tools when it comes to creating clothing. You can create anything from bikinis, to skin tight jeans, to dresses, to trench coats. Check out the pages below and get creative! #### Newbie Area[​](#newbie-area "Direct link to Newbie Area") * [Getting Started](/quickstart-sinespace-viewer/get-started-sdk/sdk-setup.md) #### How Do I?[​](#how-do-i "Direct link to How Do I?") * [Importing and Uploading Clothing](/sinespace-sdk/avatars/clothing/importing-and-uploading-clothing.md) #### Clothing Resource Files[​](#clothing-resource-files "Direct link to Clothing Resource Files") * [Male Clothing Resource Files](/sinespace-sdk/avatars/clothing/male-clothing-resource-files.md) * [Male Hair Resource Files](/sinespace-sdk/avatars/clothing/male-hair-resource-files.md) * [Female Clothing Resource Files](/sinespace-sdk/avatars/clothing/female-clothing-resource-files.md) * [Female Hair Resource Files](/sinespace-sdk/avatars/clothing/female-hair-resource-files.md) #### Reference[​](#reference "Direct link to Reference") * [Clothing Item Setting](/sinespace-sdk/avatars/clothing/clothing-item-settings.md) * [Virtual Good Component](/sinespace-sdk/components/virtual-goods.md) * [End-User License Agreement](/policies/end-user-license-agreement.md) #### Clothing Video Tutorials[​](#clothing-video-tutorials "Direct link to Clothing Video Tutorials") * [Basic Clothes](/sinespace-sdk/avatars/clothing/basic-clothes.md) * [Clothing/Variations](/sinespace-sdk/avatars/clothing/clothing-variations.md) * [Avatar Skins](/sinespace-sdk/avatars/skins.md) #### Advanced Topics[​](#advanced-topics "Direct link to Advanced Topics") * [Attachments versus Skinned Clothing](/sinespace-sdk/avatars/clothing/advanced-topics/attachments-vs-skinned-clothing.md) * [Heel Adjustments](/sinespace-sdk/avatars/clothing/advanced-topics/boots-and-heels.md) * [Full Body Replacement Costumes](/sinespace-sdk/avatars/clothing/advanced-topics/how-to-upload-avatars/full-body-replacement-costumes-with-custom-animations.md) * [Cloth Physics](/sinespace-sdk/avatars/clothing/advanced-topics/cloth-physics.md) --- ### Attachments Vs Skinned Clothing #### Overview[​](#overview "Direct link to Overview") space has both options of attachments and skinned clothing which you can use for uploading items and clothing to space. space has both options of attachments and skinned clothing which you can use for uploading items and clothing to space. There is a few differences between the two, and here are the details of the differences for you!
##### Attachments[​](#attachments "Direct link to Attachments") Attachments are just that- Attachments. They attach to your avatar on a specific bone, for example, to the neck bone if you have created a necklace. You cannot attach the attachments to multiple bones. Attachments also don't support deletion zones or advanced clothing features. Attachments are much faster than skinned clothing performance wise, and they are much easier to upload and create as there are no rigging steps.
##### Skinned Clothing[​](#skinned-clothing "Direct link to Skinned Clothing") Skinned clothing are the normal full clothing items with rigging/weighting, and also with the addition of settings such as skin deletion and skin preservation. Skin deletion is good to use if you have items of clothing which have areas cut out, such as trousers with lace up sides, or a dress with cut out side panels as you can select certain areas of the skin you want to delete. Skin preservation works in a parallel way to the skin deletion - the areas of skin you select will be preserved. This is good to use if you are also adding cloth physics to your clothing items as you can choose to preserve areas that might be shown when the cloth is moving around - e.g, you can choose to preserve the legs from the knee up if the cloth item is a skirt with physics, as you don't want the avatar's legs to disappear when the skirt is moving. --- ### Boots And Heels #### Overview[​](#overview "Direct link to Overview") Boots and shoes with heels require a little more work to set up properly in space. Boots and shoes with heels require a little more work to set up properly in space. Fortunately, it's easy to do and you should be able to get great results in no time. First things first. If you have not already familiarized yourself with the basics, check out the Clothing Basics tutorial video below. *** Now that you're familiar with the basics, try your hand at a pair of high heels or boots with heels. After loading the Space avatar into the scene, add your boots. You should see something that looks like this: *It's okay, this is perfectly normal!* Notice in the picture that the boots are lined up so the heel of the foot is aligned with where the heel would go in the boot? That's important - your boots should be at an x/y/z position of 0, 0, 0 and be similarly aligned. ##### Morph Targets[​](#morph-targets "Direct link to Morph Targets") If you are making boots or shoes that have an exposed foot or open toe design, then you need to adjust a couple settings in order to make the Space avatar's feet fit. If your boots/shoes are an enclosed design, you can skip ahead to the Clothing Item Settings section below. The first thing you're going to want to do is inspect the Space avatar in your Hierarchy panel. Open up the 2017 Female *(or 2017 Male)* object, and then open the Geo\_grp sections by clicking on the triangle to the left. Now select the femalebody *(or malebody)* object. Next, in your Inspector panel, click on the triangle to the left of Skinned Mesh Renderer and then click on the triangle next to BlendShapes to expose an avalanche of settings. These let you control various aspects of avatar positioning and shaping, and you are going to scroll to nearly the bottom of that long list to find three specific sets of controls, two of which are important for setting up your footwear: Slider.high\_heel accepts a value of 0 - 100 and affects the shape of the foot in the heel. A value of zero means no lift, and a value of 100 is an extremely high heel. Play with a setting here to find a number that works best with the shape of your boots or heels. Slider.archoffeet also accepts a velue of 0-100 and affects the offset *(or crunch)* of the arch. A value of zero means no effect, and a value of 100 is severely crunched. Make a note of the numbers that work best, and then you can change both values back to zero so that your Space avatar base is at its default values. Next, move on to the Clothing Item Settings below. ##### Clothing Item Settings[​](#clothing-item-settings "Direct link to Clothing Item Settings") Now go to your boots/shoes object, and look in the Clothing Items Settings script. Click open the triangle for Extra Settings, and then click on the triangle to the word Heel to expose the Extended Heel Settings. Make sure to tick the box that says Use Heel Settings. If you have Morph Target settings from the section above, enter your Slider.high\_heel settings under Heel Amount, and Slider.archoffeet under Arch Offset. For Avatar Center of Mass, enter a number to represent how high the avatar should be raised above the ground. A value of zero is no lift at all, and may result in the bottom of the shoes or boots going beneath the floor or ground terrain. A value of .01 equals 1 centimeter, and a value of 1 equals 1 meter. Once you've entered those settings that are specific to boots & heels, you can fill out the rest of the info in your Clothing Items Settings and Virtual Goods scripts as you normally would, and everything should look great in-world! --- ### Cloth Physics #### Overview[​](#overview "Direct link to Overview") Creating Cloth Physics Cloth Physics needs a skinned mesh, follow the steps in Importing\_and\_Uploading\_Clothing until "convert to skinned". ##### Creating Cloth Physics[​](#creating-cloth-physics "Direct link to Creating Cloth Physics") Cloth Physics needs a skinned mesh, follow the steps in [Importing\_and\_Uploading\_Clothing](/sinespace-sdk/avatars/clothing/importing-and-uploading-clothing.md) until "convert to skinned". See [Clothing/Clothing\_Item\_Setting](/sinespace-sdk/avatars/clothing/clothing-item-settings.md) for more detail on how to add clothing item setting component and to convert to skinned. Attaching Cloth component Once you have the skinned mesh attach the cloth component to the skinned mesh. To do so click on add component and search cloth and select it. ##### Cloth physics properties[​](#cloth-physics-properties "Direct link to Cloth physics properties") The Cloth component provides a physics-based solution for the simulation of fabrics. Following are the various settings you can adjust. Stretching Stiffness: Changes the stretching stiffness of the cloth. Bending Stiffness: Bending stiffness of the cloth. Use Tethers: Apply constraints that help to prevent the moving cloth particles from going too far away from the fixed ones. This helps to reduce excess stretchiness. Use Gravity: Should gravitational acceleration be applied to the cloth? Damping: Motion damping coefficient. External Acceleration: A constant, external acceleration applied to the cloth. Random Acceleration: A random, external acceleration applied to the cloth. World Velocity Scale: How much world-space movement of the character will affect cloth vertices. World Acceleration Scale: How much world-space acceleration of the character will affect cloth vertices. Friction: The friction of the cloth when colliding with the character. Collision Mass Scale: How much to increase mass of colliding particles. Use Continuous Collision: Enable continuous collision to improve collision stability. Use Virtual Particles: Add one virtual particle per triangle to improve collision stability. Solver Frequency: Number of solver iterations per second. Sleep Threshold: Cloth’s sleep threshold. Capsule Colliders: An array of CapsuleColliders which this Cloth instance should collide with. Sine Space avatars already have capsule and sphere colliders. You do not need to attach any more. ##### Edit Constraints Tool[​](#edit-constraints-tool "Direct link to Edit Constraints Tool") Selecting Edit Constraints will enter the editor into a mode to edit the constraints applied to each of the vertices in the cloth mesh. All vertices will be coloured based on the current Visualization mode to display the difference between their respective values. Max Distance: is the distance a vertex is allowed to travel from the skinned mesh vertex position. The SkinnedCloth component ensures that the cloth vertices stay within maxDistance from the skinned mesh vertex positions. If maxDistance is zero, the vertex is not simulated but set to the skinned mesh vertex position. This behavior is useful for fixing the cloth vertex to the skin of an animated character - you will want to do that for any vertices which should not be skinned, or for parts which are somehow fixed to the character’s body (such as the waist of trousers, fixed by a belt). You can either select or paint constraints and set max distance. For example in a dress you don't want the top to move at all. The bottom below waist to move slightly and the near the legs to move most. You can select the distance for each part as shown below. ##### Preparing and adding Deletion Zones[​](#preparing-and-adding-deletion-zones "Direct link to Preparing and adding Deletion Zones") ##### Add virtual goods script[​](#add-virtual-goods-script "Direct link to Add virtual goods script") Attach the virtual goods script and complete the submission process. See [Virtual Goods](/sinespace-sdk/components/virtual-goods.md) for more details on the virtual goods script. --- ### Full Body Replacement Costumes (no custom animations) #### Overview[​](#overview "Direct link to Overview") You can upload your own avatars to sinespace to wear as a full body costume. You can upload your own avatars to sinespace to wear as a full body costume. This tutorial is only for uploading your avatar to Sinespace without custom animations . 1\. Import your avatar into Unity. At the top of Unity, click on 'Assets' then 'Import new asset' and import your avatar. Make sure you have saved your avatar from the 3D software you use to model as a FBX file type. When you click on this, you will see an Import Menu. Click on the Import button at the bottom. 2\. Click on the avatar FBX in the Project window. Under the Inspector window on the right, make sure that the 'Rig' settings are as shown here: * Set the Animation Type to Humanoid. * Set Avatar definition to Create from this model. If you are uploading anything other than a humanoid, please see the page linked at the top of this tutorial. 3\. Drag your FBX into the hierarchy and click on it. In the Inspector window, you should see this: Make sure that Root Motion is unchecked . 4\. Drag the FBX back into the project window to make a prefab. 5\. Once you have the prefab in the project window, click on it. In the Inspector window, add the 'Clothing Item Settings' component. * Pick the skeleton you want the costume to fit to. * Under clothing, change the clothing type to Rigged clothing. The fitting slots layer should be set to underwear, and Chest and Pelvis should be checked under the fitting slots. * Under Materials and Patterns, check the 'Keep Materials always' box. * Check the Costume settings by clicking on the circle on the left of the Costume name. * Under the Costume settings, there is a setting called Referenced Prefab. Drag the prefab of your avatar into the Root Template box here. * If you have LOD variants of your avatar, you can add them here. 6\. Hit the Prepare button. If it is successful, the prepare button will say Re-prepare after a second. 7\. Add the virtual good component underneath the clothing item settings. 8\. Under Basic, set the information to this: 9\. Fill in the rest of the virtual good component as you normally would to upload items and hit auto submit to start the upload process. If you are not familiar with the virtual good component, you can see our [Virtual Good](/sinespace-sdk/components/virtual-goods.md) page for more information. You can check on the upload progress at [curator.sine.space](https://curator.sine.space/). --- ### Full Body Replacement Costumes (with custom animations) #### Overview[​](#overview "Direct link to Overview") Since Editor Pack 7, all space users now have the ability to create a full body replacement costume. Since Editor Pack 7, all space users now have the ability to create a full body replacement costume. The costume allows you to replace the space avatar base mesh with any object you want, such as another human avatar, an animal or an object; You can even use particle systems as your avatar! There are two parts to getting a costume working in space. You will need to first create or import your replacement costume, and then you will need to build an animator for this replacement costume. For the animations, you will need to create your own custom animations if you wish to use an object or creature as your replacement costume, but if you are using a humanoid as a replacement, you can use the default space animations, but more in detail on this later on in this guide. ##### Creating Your Costume[​](#creating-your-costume "Direct link to Creating Your Costume") You can create whatever you want to be your replacement costume, whether it be a unicorn, a wrestler or even a fire particle, anything is possible! You can create your own costume in your chosen 3D software and import it into Unity. ###### Exporting From 3D Software[​](#exporting-from-3d-software "Direct link to Exporting From 3D Software") If you have made your own costume, you will need to export the costume from your chosen 3D software as an FBX file and save it somewhere for importing into Unity later. ###### Importing From Unity Asset Store[​](#importing-from-unity-asset-store "Direct link to Importing From Unity Asset Store") If you have decided to download an object/model to use as your costume from the Unity Asset Store, then you probably won’t have to change the format of the model as most models on the asset store are already in FBX format. Once the asset has downloaded, it will ask you to import the model into Unity. I am using a warrior princess model for this guide. Make sure you have selected all of the assets by clicking on β€˜All’ then click on β€˜Import’. This will make a new folder in your Assets folder with all of the items needed for your costume. Note: Please make sure you have the rights to use the model from Unity Asset Store. ###### Importing From 3D Software[​](#importing-from-3d-software "Direct link to Importing From 3D Software") After the above step of exporting from the 3D software as an FBX file, you can import this into Unity by clicking on β€˜Assets’ and choosing β€˜Import New Asset’ at the top of the Unity screen. Then choose your FBX file. This will place the FBX file into your Assets folder. ##### Setting Up Your Costume For Upload[​](#setting-up-your-costume-for-upload "Direct link to Setting Up Your Costume For Upload") ###### Setting Up A Humanoid Costume[​](#setting-up-a-humanoid-costume "Direct link to Setting Up A Humanoid Costume") If your costume is a humanoid model, and you want to use it with the default space animations, you need to set it up to work with the animations. Uncheck the β€˜Apply Root Motion’ box. You can do this by clicking on the FBX in your hierarchy and finding the β€˜Apply Root Motion’ box in the inspector window. If Apply Root Motion is greyed out, drag the FBX into your scene, then back to the project window to create a prefab. Click on the FBX file you have imported in the project window, and under the Inspector window, choose β€˜Rig’, and set the animation type to β€˜Humanoid’. This will enable you to be able to use the default space animations for the replacement costume. ###### Setting up a Non Humanoid Costume with Animator[​](#setting-up-a-non-humanoid-costume-with-animator "Direct link to Setting up a Non Humanoid Costume with Animator") If you have chosen to use an object or animal as your replacement costume, or you want to create your own animations for a humanoid, you will need to create an animator. Animators allow you to upload completely custom animations with the replacement costume. **Making A Controller for the Animator** Animators need a controller to work, so you need to create a controller. To create a controller, right click in your project window, and choose β€˜Create’ then β€˜Animator Controller’ and begin laying it out. This is a complex step, but you can use the space editor pack controller as a template for laying out the animators; Just search for β€˜Player Controller’ in the project window. An animator controller transitions animations based on input variables - we let you insert a few variables in here (we may add more over time). Your animator needs to have all these variables listed - even if it does not use them. These variables are: * Magnitude: runs from 0.0 to 1.0 - 0.0 is standing still, 0.5 is walking, 1.0 is running (approximately. These values may deviate from these general bounds.) * Angle: Runs from -1.0 to 1.0, 0.0 is not turning. -1.0 is turning left, 1.0 is turning right. * Vertical: The users key input - moving forward/back shifts this value from -1.0 to 1.0 * Horizontal: As per above, except for the left/right keys. * Fly Vertical: 0.0 is not moving up/down in flight, -1 is descending, 1.0 is ascending. * Floor Angle: The normal angle of the floor - used for angling feet to match angled surfaces. Currently disabled. * Is Falling: On/Off - is the user in a falling state * Is Jump: On/Off - is the user currently jumping * Is Flying: On/Off - is the user currently flying See example: ##### Uploading Humanoid Costumes (No Custom Animations)[​](#uploading-humanoid-costumes-no-custom-animations "Direct link to Uploading Humanoid Costumes (No Custom Animations)") After setting the rig type to humanoid, you can go ahead and upload your costume. To upload it, first create a new empty gameobject in your scene. Click on the gameobject in the hierarchy, and click on β€˜Add Component’ in the Inspector window. Search for β€˜Clothing Item Settings’ and click β€˜Add’. This will bring up the clothing item settings. Make sure to expand the β€˜Costumes’ segment for the next step. Costumes For costume uploads. make sure the Costume setting is ticked under Clothing Item Settings. You do not need to use the "Clothing" setting as this will automatically be set. Costume Settings Under the Costume settings, there will be a setting called Referenced Prefab. Drag the prefab of the costume into this box to use this as the root template. There is also LOD Variants listed here. You can put in a High Detail template and a Low Detail Template here. The default is Medium. Finalise Before preparing, you may need to rename this empty gameobject to something else, otherwise it won’t prepare. You can rename it by scrolling to the top of the Inspector window and clicking in the box right at the top. I renamed mine to β€˜Warrior Princess’. After renaming, click on β€˜Prepare’. If it is successful, it will say β€˜Re-Prepare’ after a couple of seconds. Save this as a prefab by dragging the gameobject into your project window. Uploading Now you are ready to get the costume uploaded to space. Click on the prefab of your costume in the project window. In the Inspector window, click on β€˜Add Component’ and search for β€˜Virtual Good’ and add it. Set the content type to β€˜Clothing’ and fill in the rest of the information as you see fit. You can pick any category of clothing for the costume, it doesn’t matter which category it is under. After it’s all filled out, you can click on β€˜Automatic Submission’ to get it uploading to space. ##### Uploading Humanoid and Other Costumes with Animator[​](#uploading-humanoid-and-other-costumes-with-animator "Direct link to Uploading Humanoid and Other Costumes with Animator") To upload a costume with custom animators, follow the upload steps as above, but check β€˜Animator’ under the β€˜Slots’ segment. Scroll down to custom animations, and drag the animator controller you made into the β€˜Controller’ slot. You need to insert the names you used for the variables under the Parameters section into the various fields. These are case and syntax sensitive, so copy them exactly as they are. Note: If you want to create new transitions in the controller, remember to uncheck the "Has ExitTime" in each transition. It is picked by default. After doing this, follow the steps above to make your costume a virtual good with the virtual goods script, and your costume will get uploading to space. For more information and tutorials on animations, see below: * [Humanoid Animation](https://unity3d.com/learn/tutorials/modules/intermediate/live-training-archive/setting-up-a-humanoid-avatar) * [Animation](https://unity3d.com/learn/tutorials/topics/animation) * [Unity Learn](https://unity3d.com/learn) --- ### Basic Clothes #### Overview[​](#overview "Direct link to Overview") Basic Clothes documentation for Sinespace. [YouTube video player](https://www.youtube.com/embed/D54FJiKbMaE) --- ### Clothing Extra Pattern #### Overview[​](#overview "Direct link to Overview") .png>) Usage When you click the Prepare button you will see the materials removed. ![]() #### Usage[​](#usage "Direct link to Usage") When you click the Prepare button you will see the materials removed. To submit a range of items based on a single clothing mesh but with varied materials and textures, follow the steps on the [Importing and Uploading Clothing](/sinespace-sdk/avatars/clothing/importing-and-uploading-clothing.md); BUT leave "Keep Material Always" unticked.
--- ### Clothing Item Settings #### Overview[​](#overview "Direct link to Overview") The clothing item setting component is split into different subcategories. The clothing item setting component is split into different subcategories. Each sub-category has different settings for the clothing and the uploading of the item. When you have imported your clothing item into Unity, make sure it is selected, go to the Inspector window, click on β€˜Add Component’ and search for Clothing to add the Clothing Item Settings component to your clothing item. ![](/assets/images/ClothingSettings1-5167567aff21ca8b5ba2e3711b2ed500.png) As you can see in the above image, there are four main categories: Item, Customisation, Submission and Review; Under each of these main categories are sub-categories. #### Item[​](#item "Direct link to Item") Item is where you can change the skeleton of the avatar to match the clothing you are uploading, and you will also see a list of categories to choose from. The list of categories is: * Clothing * Costumes * Skin Material * Tattoos and Makeup * Shapes * Animations and Controllers Underneath is an explanation for all of these categories and their sub-categories. #### Clothing[​](#clothing "Direct link to Clothing") There are six sub-categories of clothing settings under the clothing category. These categories are: * Fitting and Slots * Skin and Cloth Deletion * Materials and Patterns * Level of Detail * Automatic Skin Weighting * Feet Settings At the top of the clothing settings, you can change the type of clothing you are uploading. The types are Rigged Clothing and Attachments. ![](/assets/images/clothingSettings2-5dd60f4b22edcf22c867b831d726ed0a.png) #### **Clothing Type**[​](#clothing-type "Direct link to clothing-type") This is where you choose if your clothing item is a Rigged Clothing or an Attachment. * Rigged clothing -[ Automatic Skin Wieghting](/sinespace-sdk/avatars/clothing/clothing-item-settings.md#automatic-skin-weighting) * Attachment - Tick if your item is an attachement. Then select the appropriate bone from "Attach to this bone." #### **Fitting and Slots**[​](#fitting-and-slots "Direct link to fitting-and-slots") ![](/assets/images/ClothingSettings3-1316655800016561c888630b7cca0e25.png) Fitting and slots is where you will find all the settings for the fit of the clothing and the clothing slots. ![](/assets/images/ClothingSettings4-999438f17a5790e12fb276be58127b5e.png) * Layer - This is where you can choose the layer of your clothing. For example, underwear would be under the Underwear layer, and a coat would be under the Baggy and Outerwear layer. If you set your clothing as an Underwear layer, it means other clothing can go over them. If you set your item as baggy and outerwear, it means that other items of clothing can be worn under it. For a guide on layers, please see this [layers](/sinespace-sdk/avatars/clothing/layers-guide.md) page. * Fitting Slots - The avatar slots are where the skeleton will be deleted under the clothing. If you have a t-shirt, for example, and don’t want it worn with other items, you will have to check the upper chest, chest and back slots. #### **Skin and Clothing Deletion**[​](#skin-and-clothing-deletion "Direct link to skin-and-clothing-deletion") ![](/assets/images/ClothingSettings5-999438f17a5790e12fb276be58127b5e.png) This is where you can add deletion zones, and preservation zones, recalculate bounds and also change the settings for deletion and tucking, fitting and obscuration tuning. * Deletion Zone Settings - The deletion zones are used for selecting an area of the avatar which you want to be deleted under clothing. This can be used for certain types of clothing which need a little extra deletion underneath. * Preservation Zone Settings - Preservation zones are used for selecting an area of the avatar which you want to keep under clothing. This is useful if you have clothing with holes in, e.g. a dress with a slit or a corset with a lace-up back. * Skip deletion - Tick to avoid all skin deletion being applied. * Obscuration distance - Compresses the skin under clothing items at hemlines. This allows tight-fitting clothes to squash the avatar slightly where skin emerges from under the cloth. The default distance is 1 cm. The affected vertices are highlighted in yellow when the item has been prepared. * ![](/assets/images/Obsurance_dis_2-28539b895cca000fdbec404be9722140.jpg) * Red squares indicate skin that will be deleted. Blue indicates skin that will be deleted if more than two adjacent vertices are red. Yellow indicates skin that will be squeezed in line with the Obscuration distance. ![](/assets/images/ClothingDeletionZoneObscuranceDistance-c9ca6dc82f6a495de4409c514886c4e1.jpg) info These tools are helpful if the automatic skin deletion is not perfect. For instance, with open-topped shoes, the preservation zone can ensure the automatic skin deletion does not remove parts of the foot where it should be visible. #### **Materials and Patterns**[​](#materials-and-patterns "Direct link to materials-and-patterns") ![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA5MAAABLCAYAAADtatNWAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAABzdSURBVHhe7d15kBbF+QfwZ5f7PhWJnMolcgu4q3ggqICghqhoRcRoUpVKjBo10SRl/FWlon/mD7VSqVRKS0NSqdymKCsVjUQFMQKKHHLIodz3DQLC5vd9mIbe2e6envfY1eX7qVp4Z945unt6+n2f6Z55K6qqqmqEiIiIiIiIKOCzzz6TyspKGTp0qE5X6r9EREREREREOTCYJCIiIiIiotwqqqurazp06CBt27aVJk2aJLOJiIiIiIjoXHPy5Ek5dOiQ7N+/X2pqat8RWWeYKwJJ/DGQJCIiIiIiOrchLjQxYpZK9EgSERERERERGTFxYiV7JImIiIiIiMgWEyfyATxERERERESUW51gEt2ZvXr1Cv6lx88iau3Zs2cydRbmY/lyQDr79u2bTNXVokUL6dy5czIVhptI+/TpI127dk3m1Gbygb8ePXrotomIiIiIiM5ldYJJPLHnlltukdtuu835N3369Dpdnm3atJHbb79dAy3bgAEDdB0EayGTJk1KXsVDQBcax4vAcPTo0clU2OTJk6V3794ybtw4GThwYDL3LOTvxhtv1ID54osvlhkzZmQGyek8FZJHIiIiIiKiL6o6Ud7hw4dlwYIFyVRd77//vuzZsyeZOgvrDR8+PJk6DY+MPXLkSDIl2lM4duxYGTFihDRr1kznIThDIIfAz/T4IXjDNJZr3ry5zjM9psOGDdP/jx07JgcOHND3XNu1nXfeefr+4MGDpaKiIpl7VpcuXWT+/PmyevVq6datWzK3toMHD8q8efPkP//5j7z66qu6PYjJU6F5NNODBg3SfdjBc1aeiIiIiIiIysnZZbh48WLZu3dvMnUWAsN33nknmapt+/bt0q5dO2ndurVOo2cQv0OCIBMwHz2AO3fu1ODnhhtu0Pn4/RL8lgnWx/8IttD7ifVOnDihr9GziaG1WAc9pwgiMY1eRN92jfbt28uECRNkx44dGoAh+EpbunSpTJs2TUaOHCmLFi1K5vohndhXbJ6KyePEiRP1PZQ9loOYPBEREREREZWTM5hEwPPGG28kU2e9+eabcvz48WSqrmXLlsmQIUP0NXoplyxZoq8BwdDs2bNl9+7dsm/fvjM9gLt27dKAauPGjfL5559Lv3799DUCNARfR48e1YAJNm/erIEf1jd82zXQ64dhuQhskf7ly5cn75yGIBBBG3onkX4EeJ06dUrePQs9iaNGjZIxY8bIlClTNOCOzVMxedy2bZusWLFC04ayR36y8kRERERERFRu3psZN2zYIGvXrk2mRLZu3apBTcjKlSu1txA9b927d5dPPvkkeUc0QLvrrrt0aGbHjh21982lVatW2quJoBR/plcPzP+2rO0ikHv77bc1uJ05c6Y+aMeG9LZs2VJeeOEFueSSS6R///7a65d26tQpDTQR5L3yyitaNrF5SsuTRwSfBtKAIDIrT0REREREROUWfDLO3LlzNbhBkPTvf/87meuHwGfTpk069BOBpQ33DCIYfe2112T9+vV1HuJjHtKD3joM8cS+8bdly5Yz90a6ZG0XAR96Bf/5z3/K66+/Xue+TvTyYftI+5w5c/RBO2vWrEnePQu9h6tWrdL3THpi82QUmse0rDwRERERERGVWzCYRI/ZwoULdYglhmPGwNBWPDQG69jWrVunD+S5+eabpbq6ulYPHIK0r3/963rPJXozESjdcccd+oRYPLwG0z6h7QKCxPHjx+sTavE/hqfaPvroIx1ieuutt8rUqVN1Gr2V6cDQJTZP6em8eUzLyhMREREREREgrkHMgb+YGCePihkzZgTHZjZt2lSfUoqeuVLAkFLc65eG/dhDOrFP3M8YukfT5tuukfU+9m96YfOKzVOxeUzLyhMREREREZ3b8PDOWbNm6esXX3xRf6Uiln3bIiD2wGhLdKhBZjBJREREREREX164PQ/SwWGWrGCyMj0slIiIiIiIiBoP3LIYe9uiERMnBu+ZJCIiIiIioi8v3Bp377336h9el1Kl/ZuNRERERERERDFxYsWIESNq8JuH+OF+PCCGiIiIiIiIGg/TIxnz8E48MBS/6oHftk/3ZNZ5AM+oUaNq8LMU+EF8IiIiIiIialyGDBmi/6d/vtEHASN+eQK/yW+rE0yOGTOmBjdXmhssC/lpDCIiIiIiIvri6dKli/zsZz/T108++aTs3r1bX7vgZwsBv0dp/mx1gsmqqqoa9EoyiCQiIiIiImpcEBA+8MAD+vq5556LekorgkoEjWnOYFJfEREREREREXmkg0n+NAgRERERERHlxmCSiIiIiIiIcmMwSURERERERLkxmCQiIiIiIqLcGEwSERERERFRbgwmiYiIiIiIKLeSBZPNmjWT3r17J1MiF1xwgdxxxx3St2/fZE79a9WqlXTv3j2ZajyKyVfbtm31h0txvC655BL969+/v7Ru3TpZomGYdDUGvuPTqVMnGTJkSDJVVzHH1axbH3W+vs/t+siTz3nnnSft2rVLphq3rPqZlnf5QjTksTd8aaiP/EM5241S1e9yH6dSl3Wpy7TYOoLP4549eyZT5FLuOtYYscyovpQsmGzfvr3MmDEjmRK55557ZPXq1bJt27ZkTv278MIL5frrr0+mCnffffclrxqOnYZi8nXRRRdJVVWVHq9Zs2bJwIEDZfjw4fKDH/xAA8uQdDmUslxMukqtIY6d7/i0bNlSv1z4FHNczbqlqvMh9X1u10eefK688koZMGBAMnVWMfWqIepkjKz6CXbaY5YvVkMdezufvjSUM/95yrmYMvLV7xgxZVQqpSjrUpdpKesIPo+nT5+eTJWGnb4vq1LWsWLK48talqU6LxtDXaLyatKjR4//S14XBT1bo0aNknnz5smYMWPk8ssv1y+bW7dulWPHjiVLiQwaNEiaNGkihw8f1mksu2/fPjlx4oQ2qNdcc432eOzYsUOOHz8uHTt21EBj586durzZbk1NjU4DlunTp4/8f17ksssuk4MHD8qhQ4ekc+fOerVvyZIl2pty1VVX6TTSdPLkyTPrYfsIqHbt2qU/xGkbMWKETJgwQV9jPV86baE0I434AMcV4c2bN+v7HTp0kGuvvVZ69eqly33++ec630inAVeSkY+KigoZOXKk7N+/X44cOaLvZ22rW7duusymTZs0ePzNb34jK1askLVr18ott9wiCxYscJZVOg2XXnppnXJx7duUMfbVpk0bnecqc5OuNWvW6DaNdHmF6k96WdexC6URacIXK6yLtKFscQzt+gvIC47l0aNHdTu48od8IH/4AVcs7zo+TZs21T9s06QDy23fvl3TYeqr67jaXMfHrLtx40b9H3XeVU+z0o7tueqo4Tq3feetfdyxD5sr/+Daln0eF7KvvOc+esiRNuwX59qBAwd0PSO2XuE1ynDPnj16hRhl17Vr11rrIr2utgLbS+fJtQ9b+twYO3as7N27V9MXKgOzDyxr6mdMG4B6ZJYPHRdXGYfqmM0+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) Materials is where you can set to keep the material always of the clothing or attachment. If you plan to use the pattern system which allows for color and texture variations, leave the β€˜Keep Materials Always’ unticked. #### **Level of Detail**[​](#level-of-detail "Direct link to level-of-detail") ![](/assets/images/ClothingSettings7-1a4525aaab85916a39e7522fc2565385.png) This is where you can add in the high, medium and low LOD objects of the clothing. If you do not add any, we will set it to medium by default. #### **Automatic Skin Weighting**[​](#automatic-skin-weighting "Direct link to automatic-skin-weighting") ![](/assets/images/ClothingSettings8-7b71de7cce27004183c64fa0473e65ee.png) This is where you will find the settings needed for auto-weighting the clothing. * Automatic Skin Weighting - This will automatically do the skin weighting for you without you having to do anything manually when you press the button. You can also add in a Custom Template here. This custom template is used if you have manually rigged and weighted clothes to a model in 3D software. You will need to drag the model into the Custom Template box. * Advanced Weighting Settings - You can change settings for weighting here for better outcomes manually under the advanced weighting settings. info This works well for close-fitting items but is less effective with loose items, which will usually be much better if skinned manually. #### **Feet Settings**[​](#feet-settings "Direct link to feet-settings") ![](/assets/images/ClothingSettings9-ecc998f5bfa0d2398349f8485fce2db5.png) When the 'Use Heel Settings' is ticked, you can alter the heel and avatar placement. You can check the blend shapes on the character archetypes to precisely line up shoes. Morph Targets is where you enter the data for the Heel Amount, Arch Offset, and Height Offset. Here is more information on how to set up shoes with [heels](/sinespace-sdk/avatars/clothing/advanced-topics/boots-and-heels.md). #### Finialise[​](#finialise "Direct link to Finialise") * Prepare/Re-Prepare - Once clicked, this will show the results of the skin deletion and weighting. #### Costume[​](#costume "Direct link to Costume") ![](/assets/images/ClothingSettings10-b7bf78192e40627f8b96098c000f83f2.png) This is where you can add the options for a full body replacement costume. * Referenced Prefab - This is where the root template of your costume will be. You will need to drag the costume into the Root Template box. For example, if you have a self-made avatar you want to use in sinespace, you will need to drag this avatar game object into this box. * LOD Variants - This is where you can drag the low and high poly variants of your costume/avatar. #### Skin Material[​](#skin-material "Direct link to Skin Material") ![](/assets/images/ClothingSettings11-37b3e57b481b8a8d1fa74b126ddd71ba.png) This section should only be used if you are adjusting the skin shader with a custom material. If you are just making a skin, we recommend using the tattoo and makeup system. #### Tattoos and Makeup[​](#tattoos-and-makeup "Direct link to Tattoos and Makeup") ![](/assets/images/ClothingSettings12-463adda0094aa5586b99bb9cbed020c1.png) This is where you can add tattoos, make up e.t.c as layers. * Enabled - Check this box to enable the layers. * Type - Here you can choose from different types of layers. Overlay will be an overlay layer, Tattoo will be for a tattoo, Make up is for make up, Skin is for a skin overlay layer, and Base Skin layer will replace the original avatar skin. * Blend - You can choose from a range of blend options here such as darken or soft light, they work a bit like layer masks. * Default Tint - This is the default tint of the layer. If you want a black tattoo for example, you can set the default tint to black. * Mask Mode - You have two options here, you can choose Use Albedo Alpha, or Use Albedo Alpha ignoring Albedo. * Albedo - This is where you drag the texture for the albedo. * Metal Smoothness - This is where you drag the texture for the metal smoothness. * Normal - This is where you drag the texture for the normal map #### Shapes[​](#shapes "Direct link to Shapes") ![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA5wAAAEPCAYAAAAu38sVAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAB20SURBVHhe7d130FxV/Qfgk1BDElrohCo9hCrw0juCCEiTIijqKAqMKDoOFgTFMvqHZWScASsoKCriwDBDAAURAREYSqjSQXogECBAIPn9voe9yc2ynfcgIc8zs8nu3btnz7177zvns+fcsyOGhoZmJQAAABgGL7/8clpooYXy/ZH5XwAAABhmIw455BA9nAAAAPTs9ddfTy+88EJ67rnn0qxZc0dKPZwAAAAMbIEFFkhLLLFEvnUicAIAADCQMWPGNO61JnACAAAwkOjp7ETgBAAAoIg8aVBc5Dlt2rT00ksv5Ys/6yKxLrbYYmns2LFpxIgRjaVzRBfq0ksv3XjUWlxIGrdmq6yySlpkkUXSY489ll588cV8f/To0emZZ55prAEAAMA72YMPPti494b6pEE5cD7//PM5cHYSgXPxxRdvPJojAuLHP/7x2QU2mzlzZjrrrLPmCpERXPfdd98cQuN911lnnXTVVVfldSdMmJAuueSSxpoAAAC8k3UKnAtsuOGGp0QYbJ7Kttlrr72WQ2ezGTNm5NeuttpqjSVzu/HGG9Odd97ZePSG5ZZbLq266qrp4osvzr2bDz30UFpmmWXSK6+8kp8La6+9du71jMqG6EWdOHFiWnbZZdOUKVNyOI3e1RVWWCEvi/WnT5+ebyGC8MYbb5zLi+2rem5j3f/f5jyb0tNPP52XAQAAMJjm0ayRHatrO/M1nBHeuum0ToTKZ599tvFojhiie8011zQezTF16tS05JJL5t7MGEYbPax33HFHfi6G2S666KK553P//ffPvaExpHevvfZKTz31VH68xx575HUjNO65556zw+N+++2Xe2GjzAMOOCAH1gjEcX/kyJH5uV133TU9+eSTOXhusMEGuRwAAACG37BMGhS9h5dffnnj0RxXXnllevXVVxuP5ohl5557bu4xPfDAA3NQrKbTffzxx9Ntt92WA2gE0VgewfXss8/OPZsRVpdffvm8boigecMNN6R77703/7/eeuultdZaKz388MM5oD7xxBO51zMC5sILL5yTdvSaRt3ifQAAAChj2GapfeCBB3Loq8RQ2dtvv73x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x99AAGDe9pYC549//OM8mU70Ulx00UWzG0rxzfnhhx+eLr/88vTd7343nX766Xl55bzzzktf/vKX8/NxHVJcD9osGkjRoP/hD384+xaNmuhdGS691KOTqGMMYayLx/VGVSn97J9oXEfDPnodquFwzbqVFz0gES7jFj1ocasCaPTGhOH6zIZ7v7Yqr5VojNdDWgxPrB7HezeXET05odft7nZe1PV7bHYrO2YYjR6xSvQ0xjb185m1K6NZtzJbbVs/9RgO0bu2+eab53MihpdX15G2OlaqY6/T8dFJqzJb6fTeJUQQjc+wLq6v7cfb/bkBAPOeYbuGsy6Gmsa1PvHtfHyLXfUkhPhG/MMf/nD+1juG1EVYifVDBNb4tjzEdVDRYxPflEfDKBp3Rx55ZMveivrretWpHr2KoaUxPC0a+yFeH43YKoANotdt6Wf/xAQg0aCO2SVb9W6GbuVFr+bEiRNz4IjyYp/F5DTRGI4hdqGfOjWrb/dw79fonY16VeXFkM9TTjllrvAUos4xrDKGCUfdYzKVKlDEto0fP372MMwYRhiBO/S63Z3Oi7pBjs1uZce1t/Xr+mJimii3n8+sXRnNOpXZbtu61WOQc7yT6GmN/RXnxNVXX91Y2vnY63R8dNLr8dftuB/ufRDvF72ccazElwkxdDdGLXRTr0c/x08n1eRsAMC7T5HAGQ2kaJRE7+epp54617f20bsWDYsYUve1r30tN3KqGRrj51WiERcTakTjJa6Xi4laYohglBOhKXojmtVf16tO9ehVDBf7xS9+kYcxxlCymAzl/PPPn2v2y371ui397J8QQTOG5lXX2TbrVl48Hw30mPQkxPIImtVw2tBvnerq2z3c+zVCcZR39NFH54l1orwLL7wwH6PNzj333DxM/Ac/+EFuPEcwCrFtcY1bDAON4yWGk8d1adVzvWx3p/OibpBjs1vZUZcIMCeffHL69re/ne64445c/34+s3ZlNOtUZrtt61aPQc7xbqpzIq4nrHQ79todH530evx1e+/h3gfRO/mjH/0ozxob+zwm8OmlZ7Jej36On3YieB9xxBGzgzYA8O4yYmho6M2/yTBM4qczorclGjbNqm+zo8FSF424uK6nashFr0oM84pJOKKsdppf16t29ehH1DG+8Y/hqq1CTL/62ZZe90+vhqO8Qcto9dkP537ttbxYL26t1onGcYS55557rrFkjl63u9N5UTfIsdmq7FgWQfSEE06YfY1fhJu6bnXvpYxmncpst22dXjPoOd5O/NTHJpts0nJoc9Sj3bESz8Wt32OyU5l1ndYb7n0QQ2rjfSrHHHNM/lIqJjXqpNW5Osg5X4nymicyAwDmXfGFe7QVwsC/w9mLaIzUJ6Soi0ZJu4ZJ/TXRCIkK1yfcaKfde3XSqR696qeOvep1W4b7vYejvLdSxqCffS96LS/Wa7dOLG8XFHstv9N5UTfIsdmq7Bj+GtdKRk9iBJhWYadb3Xspo1mnMtttW7d6DHKON4tws99+++WfCokZVOu/OVnpVI94rttn3Eq3bau8HfsgREiMXtTo5Y0hsPH7mhtttFGe/K2X467kuQoAzNuirVhdelQ0cAL/exEGojcyZkAd1HCU8U4R1yvGNYfxMx39zsr6bhKfaQwnjmtKI3RG8I4hw/UeTwCAQdQDZ9EhtQAAAMxfYuRTNaS2yKRBAAAAIHACAABQhMAJAABAEQInAAAARQicAAAAFCFwAgAAUITACQAAQBECJwAAAEWMGBoamtW437NRo0alXXfdNa211lrp9ddfT5MnT05///vf08yZM9Oiiy6aDjnkkHTmmWc21n57HXXUUWmRRRbJ91966aV03333peuuuy7NmDEjL+smti226dVXX20sAQAAoFcvv/xyWmihhfL9gXo4P/axj6WRI0em3/72t+n8889P66yzTtprr73ycwsssEBac8018/3/hQjBV155ZbrooovSzTffnOt27LHHzt7gbvbff/+08cYbNx4BAAAwqAXGjx9/SuN+TyK4HXDAAemnP/1p7kF8/vnn07333pt7FR999NG08MILp2233Tbdcccdaffdd09rrLFGevLJJ9Mrr7ySX7/YYoul7bbbLm2++eZpySWXzK+ZNWtWft3OO++cpk2blvbYY4/8umeeeSZNnz49vy6C7FZbbZW23HLLNG7cuPy66FFttssuu6RJkyalp556Kj3xxBPppptuSuuvv35aYokl0v3335/XaVeHTTbZJN9i3ejpfPjhh9uuCwAAwJu99tprOb+Fvns4Y2hqBLm99947h7EwderUdP311+f7IcLj9ttvn+65554cRI8++ug0YsSIvPyEE07Ir7vtttvSuuuum97//vfn10SQjcC577775mAYQfOzn/1sWnzxxfPzRxxxRO69vOuuu9Lyyy+fPvGJT+TlvfjnP/+ZJkyYkO93qsPTTz+dXnjhhfx/FZ7brQsAAEBnAw2pPeOMM/K1mieeeGI67rjj0tDQUB5iW4k0e+GFF+ZrO//yl7/k3sLoNYzrIk877bQ83PXOO+9Ml19+eQ5xlQinsX4Mhb3iiivSrbfemrbZZpu08sorp+WWWy6dffbZOfidd955uczVV1+98crOoqc03j90qsMjjzySnnvuufTf//43h95u9QUAAKC9gQJn9AL+6U9/St/4xjfSJZdckoebRs9kJXonqyG0IYbeRkANER6PPPLI3HN46KGHpgUXXDAvD3Fx6ZQpUxqPUnrggQdy0IwezbFjx6bjjz8+fe5zn8u3GFa79NJLN9bsLF5bDc0NnerQrJ91AQAAmKPvwBk9i+PHj8/3YzbXu+++O/3ud7/L1z52s+qqq+brP2OI609+8pN01llnNZ55Qwxhrcb6hjFjxuTgGj2NcT3l6aefPvv2ne98J/eE9mLixIl5ttrQrQ51/awLAADA3PoOnBEKY9bXKnSGTTfdNF/32E1MuhOT+UT4i2tBm0NqDMuNIbQh3icmCYrJh2JSouhpjB7N6KmM60EPPvjg2b2m7UQ43nHHHdNmm22Wh8OGbnWIC1yjRzR0WxcAAID2+p6lNnocn3322Ty8dOutt84z0cbEPtHLGUNnIyjGLLVxDWYlQuQtt9ySHnroobTRRhul3XbbLc/8GkNzI0RGD2K8LmagjbL32WefPIFQhM34fc8IgY899lg6/PDD8zrxG6AxeVA83yxmqY33r/6PGWXPOeecfB1niP/b1SHELLkxPDh+TuWyyy7ruC4AAABzq89SO2JoaGig3/iIXsYImjGsNoJYP0aPHp17DGOobCWWfelLX0onn3zy7J7LuKazLnpAo/cxgm28/q1oVYdKbFvMmls912ldAAAA5ogcF3kqDDRpUIiew5jRtd+wGV588cWO4S0q2Bw2Q/zuZrznWw2boVMdYtvqz3WrLwAAAG82cOAcbhHoJk2a1HgEAADAvO4dEzij1/Lqq69uPAIAAGBe1/c1nDF5z9SpU/PwVgAAAOY/Mb9O/KrHiiuu2FgyR/0azr4CZ8zgOmXKlFxwvAEAAADzn+iAjI7IcePGzf5ZycrAkwbFb2AutdRSwiYAAMB8LDJhZMPIiJ30lRxj9tb4yRAAAADmb5ENIyN2oqsSAACAIgROAAAAihA4AQAAKELgBAAAoAiBEwAAgCIETgAAAIoQOAEAAChC4AQAAKAIgRMAAIAiBE4AAACKEDgBAAAoQuAEAACgCIETAACAIgROAAAAihA4AQAAKELgBAAAoAiBEwAAgCIETgAAAIoQOAEAAChC4AQAAKAIgRMAAIAiBE4AAACKEDgBAAAoQuAEAACgCIETAACAIgROAAAAihA4AQAAKELgBAAAoAiBEwAAgCIETgAAAIoQOAEAAChC4AQAAKAIgRMAAIAiBE4AAACKEDgBAAAoQuAEAACgCIETAACAIgROAAAAht2sWbMETgAAAIbfzJkzBU4AAACGV/RuLrfccgInAAAAwysC55gxYwROAAAAhlcEztGjRwucAAAAlCFwAgAAUITACQAAQBECJwAAAEUInAAAABQhcAIAAFCEwAkAAEARAicAAABFCJwAAAAUIXACAABQhMAJAABAEQInAAAARQicAAAAFCFwAgAAUITACQAAQBECJwAAAEUInAAAABQhcAIAAFCEwAkAAEARAicAAABFCJwAAAAUIXACAABQhMAJAABAEQInAAAARQicAAAAFCFwAgAAUITACQAAQBECJwAAAEUInAAAABQhcAIAAFCEwAkAAEARAicAAABFCJwAAAAUIXACAABQhMAJAABAEQInAAAARQicAAAAFCFwAgAAUITACQAAQBECJwAAAEUInAAAABQhcAIAAFCEwAkAAEARAicAAABFCJwAAAAUIXACAABQhMAJAABAEQInAAAARQicAAAAFCFwAgAAUITACQAAQBECJwAAAEUInAAAABQhcAIAAFCEwAkAAEARAicAAABFCJwAAAAUIXACAABQhMAJAABAEQInAAAARQicAAAAFCFwAgAAUITACQAAQBECJwAAAEUInAAAABQhcAIAAFCEwAkAAEARAicAAABFCJwAAAAUIXACAABQhMAJAABAEQInAAAARQicAAAAFCFwAgAAUITACQAAQBECJwAAAEUInAAAABQhcAIAAFCEwAkAAEARAicAAABFCJwAAAAUIXACAABQhMAJAABAEQInAAAARQicAAAAFCFwAgAAUITACQAAQBECJwAAAEUInAAAABQhcAIAAFCEwAkAAEARAicAAABFCJwAAAAUIXACAABQhMAJAABAEQInAAAARQicAAAAFCFwAgAAUITACQAAQBECJwAAAEUInAAAABQhcAIAAFCEwAkAAEARAicAAABFCJwAAAAUIXACAABQhMAJAABAEQInAAAARQicAAAAFCFwAgAAUITACQAAQBECJwAAAEUInAAAABQhcAIAAFCEwAkAAEARAicAAABFCJwAAAAUIXACAABQhMAJAABAEQInAAAARQicAAAAFCFwAgAAUITACQAAQBECJwAAAEUInAAAABQhcAIAAFCEwAkAAEARAicAAABFCJwAAAAUIXACAABQhMAJAABAEQInAAAARQicAAAAFCFwAgAAUITACQAAQBECJwAAAEUInAAAABQhcAIAAFCEwAkAAEARAicAAABFCJwAAAAUIXACAABQhMAJAABAEQInAAAARQicAAAAFCFwAgAAUITACQAAQBECJwAAAEUInAAAABQhcAIAAFCEwAkAAEARfQXOESNGpFmzZjUeAQAAML+KbBgZsZO+AueoUaPSjBkzhE4AAID5WGTCyIaRETsZMTQ01Fd6nDZtWpo+fbrQCQAAMJ+Kns0Im2PHjm0smePll19OI0eOTBMnTuw/cAIAAEA79cBp0iAAAACKEDgBAAAoQuAEAACgCIETAACAIgROAAAAihA4AQAAKCCl/wOR2F3JIckTcgAAAABJRU5ErkJggg==) This is where you can paste the shape data from the client to add a shape preset to your clothing. #### Animation[​](#animation "Direct link to Animation") ![](/assets/images/ClothingSettings14-81903ca696c2a5dd7e6716742d7fc2a5.png) This is where you add the information from your animation controller. * Animation Overrides - This is where you will state the number of animation overrides, then add the element slot and humanoid animation clip. * Controller - This is where you drag in your animation controller. #### Customisation[​](#customisation "Direct link to Customisation") ![](/assets/images/ClothingSettings15-34566461f9a7a34dafaddb356751e0e5.png) warning This field has been replaced by the new β€˜Customisation’ field on the Virtual Good component. It is recommended to use that customisation field, but this method will also work. * Restrict Customisation - If this is ticked, it will restrict customisation of the clothing from other users/creators. #### Submission[​](#submission "Direct link to Submission") ![](/assets/images/ClothingSettings16-76fe28040cecd28596e5af8e93b23364.png) This is where the final settings for uploading the clothing item are. * Finalise - You can either click on β€˜Prepare’ to finalise the settings on the clothing, or you can click on β€˜Recalculate Occlusion’ to recalculate the occlusion. #### Review[​](#review "Direct link to Review") ![](/assets/images/ClothingSettings17-f3d0fe937f4831a655ffa63755aa0c55.png) This is where you can see the performance score, which is a quick estimate of the GPU and CPU power required to render the item. You can also change the Type Override to see an estimate of GPU and CPU power for similar items such as shorts, dresses or jackets.
Once all of these settings have been set, you need to add the Virtual Good component to the clothing item to upload to Sinespace.
--- ### Template #### Overview[​](#overview "Direct link to Overview") Included in the Editor Pack are several template avatar models that can be used when making new content. Included in the Editor Pack are several template avatar models that can be used when making new content. These can be found in Assets/SpacePack/Artist Project/Avatar Art/Templates. It is recommended to make a copy of the model to import into your program of choice in order to avoid accidentally saving over it. Until further notice, the 2015 or 2017 templates should be used, as the 2019 avatar models are unfinished. --- ### Clothing Variations #### Overview[​](#overview "Direct link to Overview") To submit a range of items based on a single clothing mesh but with varied materials and textures, follow the steps on the Importing and Uploading Clothing; BUT leave "Keep Material Always" unticked. To submit a range of items based on a single clothing mesh but with varied materials and textures, follow the steps on the [Importing and Uploading Clothing](/sinespace-sdk/avatars/clothing/importing-and-uploading-clothing.md); BUT leave "Keep Material Always" unticked. When you click the Prepare button you will see the materials removed. Submit the item and you will see an ID is assigned to the item; ##### Clothing Extra Pattern Component[​](#clothing-extra-pattern-component "Direct link to Clothing Extra Pattern Component") Create an empty game object in your project. This component applies to any furniture item also. Attach the Clothing Extra Pattern component to it. Enter the ID of the mesh object submitted above to the Item ID field. The default settings allow for one material per item. If you need more than one material per item change the materials index from 0 to how many additional ones you need for that item. Select or drag in the materials for the base item. For example, if all your different versions make use of the same normal or height maps, you do not need to put them into the Extra Pattern component, they will get that information from the master pattern. If a map does change from one version to the next *(a leather boot versus a metallic one, for example)*, then select or drag in the materials that are specific to that version in the element material slot/s. Shader path - *(do not touch this setting)* ##### Virtual Good Component[​](#virtual-good-component "Direct link to Virtual Good Component") It is worth mentioning that clothing variations will inherit the Product Name, Description, and Price from the Parent Clothing Item. Add the virtual good script and submit. See here for more on the [Virtual Goods](/sinespace-sdk/components/virtual-goods.md) script. For multiple variations you can duplicate and modify this object in the project folder (ctrl + d), though do make sure to clear out the Resume ID if the item you are duplicating has already been uploaded to the server. Please note that if you duplicate a virtual good that has already been submitted and has an ID, you need to wipe the ID in the Virtual Good script and change the product name before resubmitting as a new item. --- ### Creating Clothing Patterns #### Overview[​](#overview "Direct link to Overview") You can have a set of different colors or patterns for clothing in space. You can have a set of different colors or patterns for clothing in space. #### Uploading a Base Clothing Mesh[​](#uploading-a-base-clothing-mesh "Direct link to Uploading a Base Clothing Mesh") To set your clothing item up to have different patterns, first choose a main clothing mesh which you wish to recolor. When you have chosen the clothing you want, you need to add the 'Clothing Item Settings' component. Do this by clicking on 'Add Component' in the Inspector window and search for clothing item settings. Once this is done, you can then select all the slots needed for your item. I am using a vest top, so I have selected the chest and upper chest slots. Remember, if you want other items to be used with your clothing, don't select the slots for these items, such as back for wings, wrists/arms for bracelet e.t.c. ![Vestpatternslots.jpg](/assets/images/vestpatternslots-f747d9684039c088c9bfe3bcf2d04f1b.jpg) Make sure you leave 'keep material always' unchecked for making extra patterns as you just want the base mesh to upload. follow [Importing and Uploading Clothing](/sinespace-sdk/avatars/clothing/importing-and-uploading-clothing.md) from 'Steps of Uploading' to upload your clothing item to space. When it has finished processing and it's in space, make a note of the curator ID in Unity for your clothing item. You can find the curator ID at the bottom of the virtual good component, or you can click on 'Space' at the top of Unity and choose 'Items and Status' to see the ID. ![CuratorID.jpg](/assets/images/curatorid-8542a851d4d0c45cde111425c55633cb.jpg) #### Creating the Extra Patterns[​](#creating-the-extra-patterns "Direct link to Creating the Extra Patterns") To create the extra patterns, you need to first create an empty game object in your scene by right clicking in the hierarchy and choosing 'Create Empty'. You can rename this to the clothing item and color you are going to use. For example, if you have a dress and you want one of the patterns to be a plain blue, you can rename the empty object as 'Dress - Blue'. This will help you differentiate between other patterns of the same clothing item. ***Note*** You will need to use the UV map of the clothing item to make color variations in Photoshop or similar software for the patterns. Make sure your empty game object is selected and in the Inspector window, click on 'Add Component' and search for 'Clothing extra pattern'. This will bring up the component in the Inspector window. **Parent Clothing Item** This is where you put the Item ID of the clothing item, for example as shown above, mine is 2107941, so put the ID number generated for your item here. **Textures** * Diffuse - This is where you will but the diffuse map for your clothing. This contains the color you want to use. * Specular or metallic - This is for a specular or metallic map. * Normal Map - This is where to put the normal map/bump map. * Height Map - This is for a height map. * Occlusion - This is for an Occlusion map. * Emission - This will be for the emission map. * Detail Mask - This is for the detail mask map. * Customisations Slots - This is for choosing to make the item customisable with the choice of no slots or three slots. You will need to drag diffuse map into the diffuse box, and then repeat the step for any other maps you are using. #### Uploading the Extra Pattern[​](#uploading-the-extra-pattern "Direct link to Uploading the Extra Pattern") Click on 'Add Component' under the extra pattern component in the Inspector window and search for 'virtual good' and add this to your empty object. Once this is done you can add in the details for this pattern. For example, I named my item Vest top - Blue, and then filled in all the other details. Drag the item from the hierarchy into the project window to make it a prefab before clicking on auto submit. Don't add any ID to this item, as it will be generated when you auto submit this item to space. You can duplicate the prefab to make it easier for you to make multiple recolors; Just right click on the recolor in the heirarchy and choose duplicate. Remember to rename the copies to the color they will be to avoid confusion, and also remember to drag these new recolors into your project window to make a prefab before uploading to space. Watch a visual guide to these steps: [YouTube video player](https://www.youtube.com/embed/o5ETgeNAeEc) --- ### Designing Detailed Clothing #### Overview[​](#overview "Direct link to Overview") This guide covers best practices for clothing and outfit creation, using the Vlad outfit as an example. The workflow focuses on current game-character modelling practices: low-poly runtime meshes, high-detail source meshes for normal maps, PBR textures, tessellation where it helps, and careful weighting for avatar movement. The outfit showcases these areas: * Model creation * Tessellation * PBR textures * Sinespace custom clothing shaders * Weighting and skinning * Pattern variations #### Model Creation[​](#model-creation "Direct link to Model Creation") We recommend following current game-character modelling practices: use PBR texturing tools and low-poly models with a high-detail normal map. The Vlad outfit was created with high-detail models totalling roughly 1 million polygons to create normal and tangent maps, and low-detail models totalling roughly 12,000 polygons for upload to Sinespace. Useful tutorials: * [Designing a Base Mesh](https://www.youtube.com/watch?v=oXEPHVEm5wM) * [Customizing a 3D Body in ZBrush and Blender](https://www.youtube.com/watch?v=eCAbA94vaJU) * [Modeling 3D Clothes in ZBrush and Blender](https://www.youtube.com/watch?v=XGCIuVb8kxA) * [Texturing the Clothes in Substance Painter](https://www.youtube.com/watch?v=P8WBaubooX4) * [Designing Detailed Clothing](https://www.youtube.com/watch?v=OYyK4y_6lZw) #### Tessellation[​](#tessellation "Direct link to Tessellation") Tessellation shaders let you create multi-million-poly details across a model with very little performance impact. They are useful for ultra-smooth surfaces that can be viewed closely. The usual workflow is to upload a low-poly, high-performance model, then use the Sinespace tessellation shader to make it appear as a high-detail, smooth asset in-world. Tessellation shaders create dynamic detail controlled by camera distance. They use Phong tessellation to help hard edges become rounded during tessellation. ##### Phong Smoothing[​](#phong-smoothing "Direct link to Phong Smoothing") The Phong strength setting ranges from `0.1` to `1.0`: `0.1` is minimal smoothing, and `1.0` is maximum smoothing. We recommend setting Phong strength between `0.1` and `0.3` for the best results. Higher values may introduce artefacts, especially when the model animates. Make sure your renderer is set to **Skinned** when adjusting these settings. Otherwise, the values you set may look different in-world. #### Avoiding Tessellation Seams[​](#avoiding-tessellation-seams "Direct link to Avoiding Tessellation Seams") Paint red on all vertices that run along UV seams. Phong tessellation can fail on UV seams where the vertices are not connected. This creates gaps in the mesh around the UV seams. The Sinespace tessellation shader supports excluded zones. To exclude a vertex from tessellation, paint the vertex colour pure red (`255,0,0`) in your 3D modelling tool. The shader will avoid separating the mesh in that area. #### Tessellation or Geometry?[​](#tessellation-or-geometry "Direct link to Tessellation or Geometry?") Tessellation height maps can introduce complex patterns that would otherwise require extreme polygon counts, such as fabric ruffles, distressed surfaces, or wrinkles. They work best with organic patterns that do not contain hard edges, unless those edges are slightly rounded. As a guide, set **Tessellation Edge** between `5` and `15`. Higher values are much better for performance; `15` is significantly cheaper than `5`. Unless you are using a height map, there is usually no reason to go below `15`, because the result should already appear smooth. Avoid setting **Tessellation Edge** to `1`. Hard-edged non-organic shapes should use basic geometry rather than tessellation. Bitmapped height maps can introduce unwanted noise on hard-edged shapes. Basic tessellation with smoothing is excellent for rounding very smooth surfaces, such as shoes or other elements that need softened corners. #### Sinespace Custom Clothing Shader[​](#sinespace-custom-clothing-shader "Direct link to Sinespace Custom Clothing Shader") Sinespace supplies a custom shader for clothing tessellation in the editor pack. Search for **Unified Clothing and Skin (Metal and Tessellate)** and add that shader to your clothing material. For more detail, see [Unified Clothing and Skin (Metal and Tessellate)](/sinespace-sdk/avatars/unified-clothing-and-skin-metal-and-tessellate.md). []() #### Weighting and Rigging[​](#weighting-and-rigging "Direct link to Weighting and Rigging") Use skin weight transfer if you have non-skin-tight clothing, such as dresses or baggy items. Then reweight by hand as appropriate. You can use the automated skinning system built into the clothing component if your clothing item is skin-tight. #### Physically Based Rendering (PBR)[​](#physically-based-rendering-pbr "Direct link to Physically Based Rendering (PBR)") ##### Background[​](#background "Direct link to Background") PBR lets you accurately simulate a wide range of materials. It carries through energy conservation, so avatars look better across different lighting environments and maintain a more realistic look. Sinespace PBR maps follow a Metalness/Smoothness workflow based on the Unity 5 Standard Shader. Specular/Smoothness workflows can also work well. Useful PBR references: * [Physically based shading in Unity 5](https://blogs.unity3d.com/2014/10/29/physically-based-shading-in-unity-5-a-primer/) * [Working with PBR in Unity](https://unity3d.com/learn/tutorials/modules/intermediate/graphics/substance/01-02-working-with-pbr-in-unity) * [Basic theory of physically based rendering](https://www.marmoset.co/posts/basic-theory-of-physically-based-rendering/) * [Working with physically based shading - A practical approach](https://blogs.unity3d.com/2015/02/18/working-with-physically-based-shading-a-practical-approach/) ##### Creating PBR Textures[​](#creating-pbr-textures "Direct link to Creating PBR Textures") Recommended tools for creating PBR textures: * [Quixel Suite](http://quixel.se/) * [Substance Painter](https://www.allegorithmic.com/products/substance-painter) * [Marmoset](https://www.marmoset.co/) You can also use Photoshop. Photoshop cannot preview the final PBR result directly, but you can edit textures there and preview the results on your model in the Unity editor. Marmoset can be used to preview PBR textures while editing in Photoshop. #### Patterns[​](#patterns "Direct link to Patterns") For adding additional patterns to your clothing, see [Creating Clothing Patterns](/sinespace-sdk/avatars/clothing/creating-clothing-patterns.md). --- ### Female Clothing Resource Files #### Overview[​](#overview "Direct link to Overview") Here you can find the clothing resource files for female avatars. Here you can find the clothing resource files for female avatars. All of the below resource file zips include an FBX of the item, TGA files for height map, normal map and occlusion and .PNG files for the patterns/textures. All of these clothing files are owned by Sinespace. We will be adding to the list when more Sinespace clothing is released. These resource files can be used to make different pattern variations of the clothing. | 50s silk neck tie | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Female%20Clothing%20Resources/50s%20Silk%20Neck%20Tie.zip) | [Substance Painter Project](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/50s%20Silk%20Necktie.spp) | ![50sscarf200.png](/assets/images/50sscarf200-2ababaaa2fb8e95ab7c23383742a663d.png) | | ----------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | | Air hostess outfit | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Female%20Clothing%20Resources/Air%20hostess%20outfit.zip) | [Substance Painter Project](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Air%20Hostess%20Outfit.spp) | ![Airehostess300.png](/assets/images/Airehostess300-67752c22e562cbc5a3df2c45b644b795.png) | | Beach skirt | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Female%20Clothing%20Resources/Beach%20Skirt.zip) | [Substance Painter Project](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Beach%20Skirt.spp) | ![Beachskirt200.png](/assets/images/Beachskirt200-80906d565e8706e6d091b4e01baa6542.png) | | Beach top | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Female%20Clothing%20Resources/Beach%20Top.zip) | [Substance Painter Project](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Beach%20Top.spp) | ![Beachtop200.png](/assets/images/Beachtop200-e3ba9ff04486196871a61972dc7ef0b7.png) | | Bikini Shorts | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Female%20Clothing%20Resources/Bikini%20Shorts.zip) | [Substance Painter Project](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Bikini%20Shorts.spp) | ![Bikinibrief.png](/assets/images/Bikinibrief-e8ca4ac8a2bbd8c35ddaf9e597f11ada.png) | | Bikini Top | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Female%20Clothing%20Resources/Bikini%20Top.zip) | [Substance Painter Project](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Bikini%20Top.spp) | ![Bikinitop200.png](/assets/images/Bikinitop200-be6d075ebb80b39c63b5ec4701976f40.png) | | Bikini with sarong top | [Source Files](https://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Bikini%20with%20Sarong%20Top.spp) | [Substance Painter Project](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Bikini%20Top.spp) | ![Bikiniwithsarongtop.png](/assets/images/Bikiniwithsarongtop-52cf7807a5f10234470b941c92946e95.png) | | Bikini with sarong | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Female%20Clothing%20Resources/Bikini%20with%20sarong.zip) | [Substance Painter Project](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Bikini%20ith%20Sarong.spp) | ![Bikinisarongskirt.png](/assets/images/Bikinisarongskirt-b3403537bf263946f80ce61ae1fd350c.png) | | Cardigan with top | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Female%20Clothing%20Resources/Cardigan%20with%20Top.zip) | [Substance Painter Project](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Cardigan%20with%20Top.spp) | ![Cardigan200.png](/assets/images/Cardigan200-ba0f54ceaef85148736a5443a80cda85.png) | | Fitted shirt | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Female%20Clothing%20Resources/Fitted%20Shirt.zip) | [Substance Painter Project](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Fitted%20Shirt.spp) | ![Fitted shirt.png](/assets/images/Fitted_shirt-988352e057d956d86db3f7e7cb8cbdd3.png) | | Flip flops | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Female%20Clothing%20Resources/Flip%20Flops.zip) | [Substance Painter Project](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Flip%20Flops2.spp) | ![Flipflops.png](/assets/images/Flipflops-db2b0c126d8e0c6938c1f207cac8a78b.png) | | Flippers | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Female%20Clothing%20Resources/Flippers.zip) | [Substance Painter Project](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Flippers2.spp) | ![FlippersF.png](/assets/images/FlippersF-19684767cebf4049cde50d08a8f12d3e.png) | | Full swimsuit | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Female%20Clothing%20Resources/Full%20Swimsuit.zip) | [Substance Painter Project](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Full%20Swimsuit.spp) | ![Swimsuit.png](/assets/images/Swimsuit-22c2982681c2bd5faaa911be446fc0e2.png) | | Leather pants | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Female%20Clothing%20Resources/Leather%20Pants.zip) | [Substance Painter Project](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Leather%20Pants.spp) | ![Leatherpants.png](/assets/images/Leatherpants-bf8a6846dd9073892a101deeff810fcf.png) | | Mary Janes | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Female%20Clothing%20Resources/Mary%20Janes.zip) | [Substance Painter Project](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Mary%20Janes.spp) | ![Mary Janes.png](/assets/images/Mary_Janes-82877c073d78559df169abfc48080620.png) | | Pant suit jacket | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Female%20Clothing%20Resources/Pant%20Suit%20Jacket.zip) | [Substance Painter Project](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Pant%20Suit%20Jacket.spp) | ![Pantsuitjacket.png](/assets/images/Pantsuitjacket-40328168f71778b466b1134f5e979302.png) | | Pant suit Open Jacket | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Female%20Clothing%20Resources/Pant%20Suit%20Open%20Jacket.zip) | [Substance Painter Project](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Pant%20Suit%20Open%20Jacket.spp) | ![Opensuitjacket.png](/assets/images/Opensuitjacket-fa28e76f07d915d9522ab28b5a13ef57.png) | | Pant suit open pants | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Female%20Clothing%20Resources/Pant%20Suit%20Open%20Pant.zip) | [Substance Painter Project](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Pant%20Suit%20Open%20Pants.spp) | ![Opensuitpants.png](/assets/images/Opensuitpants-d212a5ee77ec99c6e24b44390e9c333d.png) | | Pant suit Pants | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Female%20Clothing%20Resources/Pant%20Suit%20Pants.zip) | [Substance Painter Project](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Pant%20Suit%20Pants.spp) | ![Pantsuitpants.png](/assets/images/Pantsuitpants-c70d7f8f33312b2cb3f6ba91ce42bc60.png) | | Patent court shoes | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Female%20Clothing%20Resources/Patent%20Court%20Shoes.zip) | [Substance Painter Project](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Patent%20Court%20Shoes.spp) | ![Patentshoes.png](/assets/images/Patentshoes-0d01bc8c65ed06c5c41abf977f50360f.png) | | Patterned pants | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Female%20Clothing%20Resources/Patterned%20Pants.zip) | [Substance Painter Project](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Patterned%20Pants.spp) | ![Patternedpants.png](/assets/images/Patternedpants-57eb97a158d5f7a8d0861f3598fe88b5.png) | | Sexy Outfit | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Female%20Clothing%20Resources/Sexy.zip) | [Hat](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Sexy%20Hat.spp) [Jacket](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Sexy%20Jacket.spp) [Lian](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Sexy%20Lian.spp) [Pants](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Sexy%20Pants.spp) [Shoes](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Sexy%20Shoes.spp) | ![Sexytwo.png](/assets/images/Sexytwo-8402c22f8b69ec2e6f3b80c9ceaca2fb.png) | | Silk scarf front knot | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Female%20Clothing%20Resources/Silk%20Scarf%20Front%20Knot.zip) | [Substance Painter Project](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Silk%20Scarf%20Front%20Knot.spp) | ![Silk knot.png](/assets/images/Silk_knot-e90f6996f2d79e9b04d3ea21e7e97757.png) | | Silk scarf one tassle | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Female%20Clothing%20Resources/Silk%20Scarf%20One%20Tassle.zip) | [Substance Painter Project](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Silk%20Scarf%20One%20Tassle.spp) | ![Silk tassle.png](/assets/images/Silk_tassle-26bd0033da467441dc0993759e6d780d.png) | | Skirt suit jacket | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Female%20Clothing%20Resources/Skirt%20Suit%20jacket.zip) | [Substance Painter Project](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Skirt%20Suit%20Jacket.spp) | ![Skirtsuitjacket.png](/assets/images/Skirtsuitjacket-63d5542c4d077bb37b73cd79794c8b01.png) | | Skirt suit skirt | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Female%20Clothing%20Resources/Skirt%20Suit%20Skirt.zip) | [Substance Painter Project](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Skirt%20Suit%20Skirt.spp) | ![Skirtsuitskirt.png](/assets/images/Skirtsuitskirt-6edddb7ab4a9409181102eec767c351e.png) | | Snorkel | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Female%20Clothing%20Resources/Snorkel.zip) | [Substance Painter Project](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Snorkel%20F.spp) | ![Snorkelcropped.png](/assets/images/Snorkelcropped-7caa9adf69fb8465fcf702ab17a5f492.png) | | sequined pants top and bottom | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Female%20Clothing%20Resources/squinted%20pants%20top%20and%20bottom.zip) | [Shorts](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Squinted%20Shorts.spp) [Top](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Squinted%20Top.spp) | ![Sequined200.png](/assets/images/Sequined200-96cd9b1efe7787da6da67f74d3f27dd8.png) | | street female | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Female%20Clothing%20Resources/street%20female.zip) | [Substance Painter Project](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Street%20Female.spp) | ![Streetfemale200.png](/assets/images/Streetfemale200-dc1dfcf5ed80d367a4d5d97a6ce4d8a9.png) | | Studded leather vest | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Female%20Clothing%20Resources/Studded%20Leather%20Vest.zip) | [Substance Painter Project](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Studded%20Leather%20Vest.spp) | ![Studdedleather200.png](/assets/images/Studdedleather200-e837d81275d12a14666e008af7b03b6c.png) | | Suede ballet flats | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Female%20Clothing%20Resources/Suede%20Ballet%20Flats.zip) | [Substance Painter Project](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Suede%20Ballet%20Flats.spp) | ![Suedeflats200.png](/assets/images/Suedeflats200-ad2f16296a3f714b0299c98ed9bc9be6.png) | | Thick heeled shoes | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Female%20Clothing%20Resources/Thick%20Heeled%20Shoes.zip) | [Substance Painter Project](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Thick%20Heeled%20Shoes.spp) | ![Thickheels.png](/assets/images/Thickheels-c77fb92163e573dee0aa22080c5656a7.png) | | Tied jacket with vest | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Female%20Clothing%20Resources/Tied%20Jacket%20with%20Vest.zip) | [Original](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Tied%20Jacket%20with%20Vest.spp) [Revised](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Tied%20Jacket%20With%20Vest%20Revised.spp) | ![Tiedvest.png](/assets/images/Tiedvest-fc0d36bd8a3e54f9c75e4bb021a2e104.png) | | womens camo capris | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Female%20Clothing%20Resources/Womens%20Camo%20Capris.zip) | [Substance Painter Project](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Womens%20Camo%20Capris.spp) | ![Camocapris.png](/assets/images/Camocapris-a47af18363f3013310ed0cd95c4e3522.png) | | womens emo vest | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Female%20Clothing%20Resources/Womens%20Emo%20Vest.zip) | [Substance Painter Project](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Womens%20Emo%20Vest.spp) | ![Emovest.png](/assets/images/Emovest-af709a515b790f6c2285c4394bb39bcf.png) | | womens polo hoodie | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Female%20Clothing%20Resources/Womens%20Polo%20Hoodie.zip) | [Substance Painter Project](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Womens%20Polo%20Hoodie.spp) | ![Polohoodie200.png](/assets/images/Polohoodie200-255d5d58858274f5f2362ba0ebf6c02c.png) | | womens shorts with cat belt | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Female%20Clothing%20Resources/Womens%20Shorts%20With%20Cat%20Belt.zip) | [Substance Painter Project](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Womens%20Shorts%20with%20Cat%20Belt.spp) | ![Shortscatbelt.png](/assets/images/Shortscatbelt-9df0351d13ce654c23da041f38f2bfd6.png) | | yoga pants | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Female%20Clothing%20Resources/Yoga%20Pants.zip) | [Substance Painter Project](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Yoga%20Pants.spp) | ![Yogapants.png](/assets/images/Yogapants-b3f18a78d0fc9c6a382f7dccacfdaf53.png) | | Vlad Outfit | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Female%20Clothing%20Resources/Vlad%20Outfit%20Resource.zip) | [Glasses](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Vlad%20Glasses.spp) [Gloves](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Vlad%20Gloves.spp) [Hat](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Vlad%20Hat.spp) [Jacket](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Vlad%20Jacket.spp) [Necklace](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Vlad%20Necklace.spp) [Pants](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Vlad%20Pants.spp) [Shoes](http://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Vlad%20Shoes.spp) | ![Vladoutfit.png](/assets/images/Vladoutfit-6225f8e18f39e34286a7492ba4f332c8.png) | --- ### Female Hair Resource Files #### Overview[​](#overview "Direct link to Overview") This page lists source files for female avatar hair resources. The resource ZIP files include pattern or texture PNG files, a Unity package, and an FBX. These hair files are owned by Sinespace. #### Resource Files[​](#resource-files "Direct link to Resource Files") | Hair | Source files | Preview | | --------------------- | -------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | | Blunt Fringe Bob | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Male%20Hair%20Resources/Womens%20Blunt%20Fringed%20Bob.zip) | ![Blunt Fringe Bob](/assets/images/bluntfringebob200-784ab7dedca158618416657266fac8dc.png) | | Bob | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Male%20Hair%20Resources/Womens%20Bob.zip) | Preview unavailable | | Emo Bob | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Male%20Hair%20Resources/Womens%20Emo%20Bob.zip) | ![Emo Bob](/assets/images/emobob200-153281baa2314b9830dd1ea71ad59974.png) | | Womens' Emo Hair | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Male%20Hair%20Resources/Womens%20Emo%20Hair.zip) | ![Womens\' Emo Hair](/assets/images/emohair200-47fda3a33dd9861911eff817695d20df.png) | | Rave Dancer | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Male%20Hair%20Resources/Womens%20Rave%20Dancer%20Hair.zip) | ![Rave Dancer](/assets/images/ravedancer200-c35aca7fe1f680d5d0f40a91e3c05706.png) | | Striped Hair with Bow | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Male%20Hair%20Resources/Womens%20Striped%20Hair.zip) | ![Striped Hair with Bow](/assets/images/stripedhairwithbow200-20e6fe611f04f42aa08082f2fbc28940.png) | | Womens' Ponytail | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Male%20Hair%20Resources/Womens%20Ponytail.zip) | ![Womens\' Ponytail](/assets/images/womensponytail200-0e99a682e0acb7450eb1c0e41ea4539a.png) | | Wavy Bob | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Male%20Hair%20Resources/Womens%20Wavy%20Bob.zip) | ![Wavy Bob](/assets/images/wavybob200-b5f80e216655a05a0ad10fb959b62004.png) | --- ### Importing and Uploading Clothing #### Overview[​](#overview "Direct link to Overview") Importing and Uploading Clothing This is in the middle of an update. #### Importing and Uploading Clothing[​](#importing-and-uploading-clothing "Direct link to Importing and Uploading Clothing") This is in the middle of an update. Please ask for any help needed. Discord fashion and clothing. You can make clothing for your avatars in Sinespace by using any 3D software of your choice. You can use the avatars from the editor pack as a reference for your clothing; Just import it into your software and start making your clothing! Once your clothing is made, you can export the clothing as obj or fbx files, save it anywhere you want, and from there, you can setup your scene ready for importing your clothing item for upload. ##### Setting Up Your Unity Scene For Uploading[​](#setting-up-your-unity-scene-for-uploading "Direct link to Setting Up Your Unity Scene For Uploading") Make sure you put the same reference avatar (male or female) you used to make clothing into your scene, just in case you need it for resizing your item or any other changes. ##### Importing Your Clothing Item[​](#importing-your-clothing-item "Direct link to Importing Your Clothing Item") You will need to import your clothing item into the scene as well. First, go to Assets at the top of Unity, and then on the dropdown menu, choose Import Asset. This will open up your Explorer, and you can find your clothing item which you saved as an obj/fbx file. Once found, you can click on Import, and the item will be dropped into the main Assets folder. You can create a new folder and name it for organisation of your items. ![Unityimport.png](/assets/images/300px-Unityimport-0963f2995facf52a5310d6fa90fef875.png) ###### Manually Rigged Clothing[​](#manually-rigged-clothing "Direct link to Manually Rigged Clothing") If you are importing manually rigged clothing, make sure your mesh is exported with a Location of <0.0,0.0,0.0> and Scale of <1.0, 1.0, 1.0> and Rotation of <-90,0,0>, and to tick "Experimental" and press apply transform in Export Settings. ![Manualrigproperties.jpg](/assets/images/Manualrigproperties-51f2a423dbd148d53d238e7ad0ac308c.jpg) ![Manualrigexportsetting.png](/assets/images/Manualrigexportsetting-f8d45b2cd25c5340bd194aca4a312201.png) ##### Steps of Uploading[​](#steps-of-uploading "Direct link to Steps of Uploading") Open the folder you put your item in in Unity, and find the obj/fbx file. Drag this file into the Unity hierarchy. The Space avatar should be listed there too. ![Clothinghierarchy.png](/assets/images/300px-Clothinghierarchy-29d82c873531e405e487857c2898b592.png) This should automatically fit your clothing to the avatar, but if it doesn’t, you might have to change the scale of the item under its Import Settings to 0.01. You can access the Import Settings by clicking the item in its Unity folder. If you used Blender to make the clothing, then the clothing should be the right scale already. ![InspectorImportSettings.png](/assets/images/1000px-InspectorImportSettings-4aa75c0a75b34fbf7b74fd7be0a97ad5.png) 2\. Click on the clothing item in the hierarchy, and under the Inspector window on the right hand side of the screen, click on Add Component and search for Clothing Item Settings and add it. ![Clothingitemsettingup.png](/assets/images/1000px-Clothingitemsettingup-e81589752cee59dcb79566fbf1fe6b90.png) This will add Clothing Items Settings under the Inspector window. Please see the [Clothing Item Setting](/sinespace-sdk/avatars/clothing/clothing-item-settings.md) page to see what each part of the clothing settings does. ![Overviewclothing2.png](/assets/images/Overviewclothing2-63ae733ce61675fb05b3e678db8ab0ff.png) Skeleton Selection The skeleton selection needs to be set to the same skeleton you used for making the clothing, so if you chose the female Space avatar, you will need to set this to Base Female, and if you used the male avatar, you will need to set this to Base Male. Fitting and slots You can choose the layer of your clothing here and also set the slots for the item. If you set the layer to 'Underwear' for example, this means other clothing with different layers can go over the top of your clothing. If you set the layer to 'Outwear', other clothing can go underneath it. For items like jeans and t-shirts, 'Close Fitting' is a good layer to set it to. You will need to check the slots of the item. The avatar slots are where the skeleton will be deleted under the clothing. If you have a t-shirt for example, and don’t want it to be worn with other items, you will have to check the upper chest, chest and back slots Skin and Cloth Deletion This is where you can add deletion zones, preservation zones, recalculate bounds and also change the settings for deletion and tucking, fitting and obscuration tuning. * Deletion Zone Settings - The deletion zones are used for selecting an area of the avatar which you want to be deleted under clothing. This can be used for certain types of clothing which need a little extra deletion underneath. * Preservation Zone Settings - Preservation zones are used for selecting an area of the avatar which you want to keep under clothing. This is useful if you have clothing with holes in, e.g, a dress with a slit or a corset with a lace-up back. Materials and patterns You will need to check this option so the material on your clothing will be visible when you upload your item. Please leave this unchecked if you plan on adding pattern variations. Level of Detail ![LOD1.png](/assets/images/600px-LOD1-5a7422becfa4123095abd98b7367d957.png) This setting is optional. If you want to include high, medium and low detail you can do so here by dragging in the game object containing the SkinnedMeshRender component. If you do not want to include these, the default LOD for your clothing item will be medium. Automatic Skin Weighting ![Autoweighting.png](/assets/images/Autoweighting-3055657593caad23777faa510386bf3f.png) When you have hit 'Prepare' on your clothing item, you can come back to this setting and re-weight the item or change the advanced weighting settings. Feet Settings ![FeetSettings.png](/assets/images/600px-FeetSettings-2c048452c2b5bf0cc1c3ed9d2c4ab3bb.png) You only need to use this setting if you are uploading high heels and need to adjust the heel height and avatar placement. Clothing Settings - Customisation tab ![Customisationcs.png](/assets/images/Customisationcs-7f11fb50ee3a8b9abec47869f72a900e.png) Here you can restrict other users from customizing your items. ##### Preparing the Clothing[​](#preparing-the-clothing "Direct link to Preparing the Clothing") To prepare the clothing, all you need to do is click the big blue prepare button to get the clothing ready to upload. This will add all of the weighting settings and all of your other settings. ![Preparefin.png](data:image/png;base64,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) ##### Making the Prefab[​](#making-the-prefab "Direct link to Making the Prefab") A prefab of your item is needed for uploading. To make a prefab, simply drag your item from the hierarchy into the project folder. ![Makeaprefab.png](/assets/images/Makeaprefab-99e6caefdd7b9690c12b20403823aae4.png) ##### Setting up the Prefab for Upload[​](#setting-up-the-prefab-for-upload "Direct link to Setting up the Prefab for Upload") The prefab will be selected already from dragging and dropping into the project window. With it selected, you will see it has all the same information under the Inspector window as the original obj/fbx file. Underneath the clothing item setting component, you will see another Add Component button. Click on it, and search for Virtual Good and add it. Adding the Virtual Good will allow you to set your clothing item as a salable good in Sinespace. ##### Virtual Good Settings[​](#virtual-good-settings "Direct link to Virtual Good Settings") Once you have added the virtual good component, you can go to our [Virtual Goods](/sinespace-sdk/components/virtual-goods.md) page to see how this component works. This is used to upload your item to Sinespace. For clothing, under the Basic tab of the virtual good component, set the Type to Clothing, then choose the appropriate category. The rest of the virtual good component you can fill out how you want to. ![Clothingbasic.png](/assets/images/600px-Clothingbasic-108506ca38fac2ec8005f23424ed8f5a.png) To check on your items' upload progress, go to our [curator site](https://curator.sine.space/). #### Video/Basic Clothes[​](#videobasic-clothes "Direct link to Video/Basic Clothes") This tutorial shows you how to set up clothing and import clothing into Space. [YouTube video player](https://www.youtube.com/embed/D54FJiKbMaE) --- ### Layers Guide #### Overview[​](#overview "Direct link to Overview") When preparing a clothing item for upload, you need to make some choices in where the item will go and how the item will fit on the avatar. When preparing a clothing item for upload, you need to make some choices in where the item will go and how the item will fit on the avatar. This allows users to easily change clothes as well as mix and match outfits from different creators to create their own unique looks. Space allows users to wear one item per clothing layer in each slot, on their avatar's skeleton. You set this up in the Clothing Item Settings component on the Item -> Clothing -> Fitting tab *(see the pc below)*. When creating an item to be worn, you start with the skeleton, leave the second drop-down menu at the default of Rigged Clothing when creating clothing items, and then choose the clothing layer and which slot *(or slots)* to use. Note: The Chest(include Upper Chest) and Pelvis slots are a little special, they control whether the avatar will be masked if the necessary slot is empty, i.e., male character need at least wear a pants and female need pants and top wear, or the avatar will be blue masked. So if you're creating some clothing items not covering the sensitive parts of human body, you shouldn't pick the chest, upper chest and pelvis slot, or it will cause the item against the Review Policies. Actually, you can leave those slots blank if you have no idea where to put your items on, especially for the attachment-type clothing items.
![](/assets/images/LayersGuide-87b1eb5ba961e4ab2b79d45061327e1b.png) Skeleton Selection Choose the relevant skeleton for your clothing item. Please note Space supports multiple third-party skeletons as well as its own native male and female models. Your item will only appear in the store or the wardrobe for a user wearing that particular skeleton. Clothing Layer Set the clothing item to one of five sorting layers. Mesh deletion and tucking of clothing items is applied dynamically in accordance with this layer. So if a user wears a pair of boots set to "Close Fitting" worn with a pair of pants set to "Skintight," the pants mesh will be deleted inside the boots. If the user then changes to a different pair of pants set to "Loose Fitting" the same pair of boots will then be deleted inside the pants. ![]() Slots Tick the slots your clothing item should occupy. When a user puts on an item, it will automatically remove other clothing items that occupy the same slot. Be careful not to select slots unnecessarily; for instance, a normal jacket would cover chest and uppper chest. But selecting back as well would prevent users from wearing the jacket with a backpack or wings.
#### Layers & Slots Guide[​](#layers--slots-guide "Direct link to Layers & Slots Guide") Below is a list of some of the clothing items that are typically worn on each clothing layer. ###### Underwear[​](#underwear "Direct link to Underwear") * Stockings, Socks * Panties * Layering Lace Tops * Glitch Pants * Tattoos ###### Skintight[​](#skintight "Direct link to Skintight") * Collar Shirt *(tucked in)* * Bodice * Bikini * Boots & Shoes *(worn under pants)* ###### Close Fitting[​](#close-fitting "Direct link to Close Fitting") * Pants * Skirt * Shorts ###### Loose Fitting[​](#loose-fitting "Direct link to Loose Fitting") * Corset * Waistcoat/Vest * Shirts *(untucked)* ###### Baggy And Outerwear[​](#baggy-and-outerwear "Direct link to Baggy And Outerwear") * Coats * Boots *(worn over pants)* * Belts * Jackets Below is a list of what slots some of the SineSpace creators are standardizing for different types of clothing. Following this guide can not only take away some of the guesswork, but also make it easier for your customers and friends to wear your creations with other parts of their wardrobe. This list will grow over time, as more designers discover what works best for them. * Neck - cravat, scarf, neckwear * Chest - shirt, waistcoat/vest, corset, jacket/coat * Back - backpacks, wings * pelvis - stocking, skirts, pants * right/left hand - gloves & mittens * right/left foot - shoes, boots --- ### Male Clothing Resource Files #### Overview[​](#overview "Direct link to Overview") Here you can find the clothing resource files for male avatars. Here you can find the clothing resource files for male avatars. All of the below resource file zips include an FBX of the item, TGA files for height map, normal map and occlusion and .PNG files for the patterns/textures. All of these clothing files are owned by Sinespace. We will be adding to the list when more Sinespace clothing is released. ##### Zip Files[​](#zip-files "Direct link to Zip Files") | Beige Suit Jacket | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Male%20Clothing%20Resources/Beige%20Suit%20jacket.zip) | [Substance Painter Project](https://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Beige%20Suit%20Jacket.spp) | ![Beigejacket200.png](/assets/images/Beigejacket200-61738c82d489df781704726f0efea51c.png) | | ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | | Beige Suit Pant | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Male%20Clothing%20Resources/Beige%20Suit%20pant.zip) | [Substance Painter Project](https://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Beige%20Suit%20Pants.spp) | ![Beigepants200.png](/assets/images/Beigepants200-37593fe4ca38c785e21216eedc6ab909.png) | | Black Brogue Shoes | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Male%20Clothing%20Resources/Black%20Brogue%20Shoes.zip) | [Substance Painter Project](https://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Black%20Brogue%20Shoes.spp) | ![Blackbrogue200.png](/assets/images/Blackbrogue200-21d50d839c1da578781f6312c573ae5b.png) | | Black Dress Shoes with Buckle | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Male%20Clothing%20Resources/Black%20Dress%20Shoes%20With%20Buckle.zip) | [Substance Painter Project](https://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Black%20Dress%20Shoes%20with%20Buckle.spp) | ![Blackshoeswithbuckle200.png](/assets/images/Blackshoeswithbuckle200-909ab07ec4b5c3122964a90bc0507bc5.png) | | Black Suit Jacket | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Male%20Clothing%20Resources/Black%20Suit%20jacket.zip) | [Substance Painter Project](https://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Black%20Suit%20Jacket.spp) | ![Blackjacket200.png](/assets/images/Blackjacket200-23186af11051eec70ef5e8134c1bbc63.png) | | Black Suit Pant | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Male%20Clothing%20Resources/Black%20Suit%20pant.zip) | [Substance Painter Project](https://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Black%20Suit%20Pants.spp) | ![Blackpants200.png](/assets/images/Blackpants200-5d6c1ec9806efc0594b71f642b9cf3fb.png) | | Boardshorts | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Male%20Clothing%20Resources/Boardshorts.zip) | [Substance Painter Project](https://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Mens%20Board%20Shorts.spp) | ![Boardshorts200.png](/assets/images/Boardshorts200-dd80f2d408263355116f67dcd7e36943.png) | | Brown Slip on Dress Shoes | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Male%20Clothing%20Resources/Brown%20Slip%20on%20Dress%20Shoes.zip) | [Substance Painter Project](https://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Brown%20Slip%20on%20Dress%20Shoes.spp) | ![Brownslipshoes200.png](/assets/images/Brownslipshoes200-9a0d54addc622f0803d2b6bfa9bd907e.png) | | Checkered Suit Jacket | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Male%20Clothing%20Resources/Checkered%20Suit%20jacket.zip) | [Substance Painter Project](https://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Checkered%20Suit%20Jacket.spp) | ![Checkeredjacket200.png](/assets/images/Checkeredjacket200-47c8df01f26247d25b1bf8886c7a320c.png) | | Checkered Suit Pant | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Male%20Clothing%20Resources/Checkered%20Suit%20pant.zip) | [Substance Painter Project](https://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Checkered%20Suit%20Pants.spp) | ![Checkeredpants200.png](/assets/images/Checkeredpants200-c903ab677c878f65fd0eccf70541f700.png) | | Flippers | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Male%20Clothing%20Resources/Flippers.zip) | [Substance Painter Project](https://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Flippers.spp) | ![Flippersmale200.png](/assets/images/Flippersmale200-2500cdd110e9a35454dac1561ca87d6b.png) | | Hooded Jacket | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Male%20Clothing%20Resources/Hooded%20Jacket.zip) | [Substance Painter Project](https://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Hooded%20Jacket.spp) | ![Hoodedjacket200.png](/assets/images/Hoodedjacket200-954a1e4971991007d4c7f99ca1c898da.png) | | Longer Boardshorts | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Male%20Clothing%20Resources/Longer%20Boardshorts.zip) | [Substance Painter Project](https://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Longer%20Board%20Shorts.spp) | ![Longerboardshorts200.png](/assets/images/Longerboardshorts200-dfedcfdcdd3a10cd01c29b000fc61268.png) | | Mens Baggy Cutoffs | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Male%20Clothing%20Resources/Mens%20Baggy%20Cutoffs.zip) | [Substance Painter Project](https://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Mens%20Baggy%20Cutoffs.spp) | ![Baggycutoffs200.png](/assets/images/Baggycutoffs200-3b927df3882f15526a394ff21db76482.png) | | Mens Bomber Vest with Shirt | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Male%20Clothing%20Resources/Mens%20Bomber%20Vest%20With%20Shirt.zip) | [Substance Painter Project](https://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Mens%20Bomber%20Vest%20with%20Shirt.spp) | ![Bombervest200.png](/assets/images/Bombervest200-bc7d43dc551a61037ac2c8cd0e7656b5.png) | | Mens Emo Drainpipe Trousers | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Male%20Clothing%20Resources/Mens%20Emo%20Drainpipe%20Trousers.zip) | [Substance Painter Project](https://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Mens%20Emo%20Drainpipe%20Trousers.spp) | ![Drainpipetrousers200.png](/assets/images/Drainpipetrousers200-54ec537d5b175ed90933ace8bed8763b.png) | | Mens Emo Spiked Vest | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Male%20Clothing%20Resources/Mens%20Emo%20Spiked%20Vest.zip) | [Substance Painter Project](https://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Mens%20Emo%20Spiked%20Vest.spp) | ![Spikedvest200.png](/assets/images/Spikedvest200-fed988b11f5298d79e9d94d08db2c61e.png) | | Office Pants | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Male%20Clothing%20Resources/Office%20Pants.zip) | [Substance Painter Project](https://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Office%20Pants.spp) | ![Officepants200.png](/assets/images/Officepants200-f3f4b44511acb217daf4067208b42b5a.png) | | Open Collar Suit | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Male%20Clothing%20Resources/Open%20Collar%20Suit.zip) | [Substance Painter Project](https://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Open%20Collar%20Suit.spp) | ![Collarsuit200.png](/assets/images/Collarsuit200-c96f28b680246d11429f1b3911bc56f0.png) | | Scifi Male | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Male%20Clothing%20Resources/Scifi%20Male.zip) | Substance Files: [Hat](https://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Sci%20Fi%20Male%20Hat.spp) [Jacket](https://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Sci%20Fi%20Male%20Jacket.spp) [Pants](https://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Sci%20Fi%20Male%20Pants.spp) | ![Scifi200.png](/assets/images/Scifi200-a9e9ce09b90ea3c0b052f9657ad69731.png) | | Shirt with Woolen Vest | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Male%20Clothing%20Resources/Shirt%20with%20Woolen%20Vest.zip) | [Substance Painter Project](https://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Shirt%20and%20Tie%20with%20Woolen%20Vest.spp) | ![Woolenvest200.png](/assets/images/Woolenvest200-4d7171c1fcaa23d9c9f9b8a52d4fd492.png) | | Snorkel | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Male%20Clothing%20Resources/Snorkel.zip) | [Substance Painter Project](https://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Snorkel.spp) | ![Snorkel200.png](/assets/images/Snorkel200-d6ed09fef69500b5a7da0ce36cbf7320.png) | | Street male | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Male%20Clothing%20Resources/street%20male.zip) | [Substance Painter Project](https://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Street%20Male.spp) | ![Streethoodie200.png](/assets/images/Streethoodie200-a3b70996edd626c6df728149c6672bf0.png) | | Track Pants | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Male%20Clothing%20Resources/Track%20Pants.zip) | [Substance Painter Project](https://space-files.s3.amazonaws.com/sample-art/substance-templates/clothing/Track%20Pants.spp) | ![Trackpants200.png](/assets/images/Trackpants200-f673a2fa569bd7d87c8fbaaa3f2a3ba9.png) | --- ### Male Hair Resource Files #### Overview[​](#overview "Direct link to Overview") This page lists source files for male avatar hair resources. The resource ZIP files include pattern or texture PNG files, a Unity package, and an FBX. These hair files are owned by Sinespace. #### Resource Files[​](#resource-files "Direct link to Resource Files") | Hair | Source files | Preview | | ----------------- | ------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ | | Mens' Combed Back | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Male%20Hair%20Resources/Combed%20Back.zip) | ![Mens\' Combed Back](/assets/images/menscombback200-57d51e0f83f8231ed8d05289b56a9fc9.png) | | Mens' Ponytail | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Male%20Hair%20Resources/Mens%20Ponytail.zip) | ![Mens\' Ponytail](/assets/images/mensponytailfront200-9918c87e17dcd37f4468487329d3919a.png) | | Mens' Side Fringe | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Male%20Hair%20Resources/Mens%20Emo%20Side%20Fringe.zip) | ![Mens\' Side Fringe](/assets/images/menssidefringe200-22e1ce56886d0764b834825e5b0eaabe.png) | | Let Hair Rule | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Male%20Hair%20Resources/Hair01Male.zip) | ![Let Hair Rule](/assets/images/hair01male200-732dbfe7e16477dfaac77e27a2e5b3cf.png) | | Treat Me | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Male%20Hair%20Resources/Hair03Male.zip) | ![Treat Me](/assets/images/hair03male200-8391d9f6394dcd365bf6b93b20144fb9.png) | | Mens' Bandana | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Male%20Hair%20Resources/Mens%20Hair%20with%20Bandana.zip) | ![Mens\' Bandana](/assets/images/malebandana200-9776578c8b14a75224e733eec5bb5b2b.png) | | Mens' Emo Hair | [Source Files](https://space-files.s3.amazonaws.com/wiki%20resources/Male%20Hair%20Resources/Mens%20Emo%20Hair.zip) | ![Mens\' Emo Hair](/assets/images/menemohair200-7e0028b842c2dce7e1621e1c2b72a4f9.png) | --- ### Gestures #### Overview[​](#overview "Direct link to Overview") The gesture system in Space allows you to create, publish and sell a range of animations and choreographed multi-user interactions. The gesture system in Space allows you to create, publish and sell a range of animations and choreographed multi-user interactions. ##### Key Articles[​](#key-articles "Direct link to Key Articles") * **Gestures Home** * [Setting Up](/sinespace-sdk/avatars/gestures/set-up.md) * [Single Person](/sinespace-sdk/avatars/gestures/single-person-animation.md) * [Multi Person](/sinespace-sdk/avatars/gestures/multi-person-animations.md) * [Animated Cameras](/sinespace-sdk/avatars/gestures/animated-cameras.md) * [Props](/sinespace-sdk/avatars/gestures/props.md) * [Special FX](/sinespace-sdk/avatars/gestures/visual-fx.md) --- ### Animated Cameras #### Overview[​](#overview "Direct link to Overview") You can animate the camera in concert with the character animations in your gesture. You can animate the camera in concert with the character animations in your gesture. There are two options; * Avatar Effect Camera Script - create an animated path from a start and end point in Unity * Avatar Effect Camera Movement Script - import an animation for the camera from another application. ##### Option 1 - Avatar Effect Camera Script[​](#option-1---avatar-effect-camera-script "Direct link to Option 1 - Avatar Effect Camera Script") This component is accessed via the Unity Component menu, then select Avatar Effects and then "Camera Follow Character". ![](/assets/images/gesture-camera-character-script-default-65801526aeb9f8643e0c82e0199b9e2f.jpg) Start position and Duration You can set a start position and duration for the camera here. Rails Type Linear will move the camera straight from start point to end point. Rotation will move around the avatar. Interpolation Choose either Linear or Smooth. Offsets The offsets allow you to place the camera in relation to the avatar. Y+ is up. Z+ is forward. So; X0, Y1, Z2 will put the camera 1 meter above ground, 2 meters in front of the avatar. Tracking Options The tracking options will animate the camera in line with the selected bone (Tracking target). Tracking Target Start / End Avatar - For two person gestures you can move the camera target from one avatar to the other. Start - End Target - You can move the camera's focus from one bone to another over the duration of the gesture. ##### Option 2 - Avatar Effect Camera Movement Script[​](#option-2---avatar-effect-camera-movement-script "Direct link to Option 2 - Avatar Effect Camera Movement Script") This component is accessed via the Unity Component menu, then select Avatar Effects and then "Camera Follow Path". You can apply animation from an fbx file to the camera using the Avatar Effect Camera Movement Script. ![](/assets/images/gesture-camera-path-script-f222bf4ba4e437962f0d7d4e287b0ede.jpg) Legacy Animation Clip Drag the fbx file containing your animation into the Legact Animation Clip field. See below for FBX settings. Child name The name of the camera in your FBX file Focus name The name of the camera target in your FBX file Tweak Axis Unity's orientation is; Y+ = Up Z+ = Forward If your files export from your animation editor with a different orientation you can align to achieve your desired orientation using the Tweak Axis fields. Offset / Ignore rotation Use these if you want to make universal adjustments to the animation in the editor. Start time / End time Set the end time to the same as your animation file. ##### FBX settings[​](#fbx-settings "Direct link to FBX settings") Add keyframes at start and end Before you import your fbx file it needs to contain two animated objects; a Camera and Camera Interest. Please ensure that for both objects there is a keyframe at the start and end of the track;
###### A screenshot from Motion Builder[​](#a-screenshot-from-motion-builder "Direct link to A screenshot from Motion Builder") ![](/assets/images/350px-animate-camera-path-52f69b0a0927f12e987a196031ee60cf.jpg)
Copy Field of View data to Camera Scale X Before you import your fbx file please copy the field of view information into the Camera object's X scale track. The Legacy Animation rig that sinespace uses to apply the animation to the user's camera inworld, does not pick the data directly from the Field of View track in your animation editor.
###### A screenshot from Motion Builder[​](#a-screenshot-from-motion-builder-1 "Direct link to A screenshot from Motion Builder") ![](/assets/images/350px-field-of-view-0a3d4ae26f40fd2dbbd5b45f44529e46.jpg) ###### Import settings[​](#import-settings "Direct link to Import settings") When you import your FBX file, open the Rig tab in the Inspector. Set the Animation Type to Legacy Animation Clip. Set Generation to Store in Root (new)
![](/assets/images/camera-fbx-set-to-legacy-02247176653f1a0f9af638ee90b82b2b.jpg) --- ### Gestures/Snapshot Tools #### Overview[​](#overview "Direct link to Overview") Introduction The snapshot tools allow users to create camera positions, filters, poses & overlays that can be used for taking awesome pictures in Sinespace using the snapshot system. ##### Introduction[​](#introduction "Direct link to Introduction") The snapshot tools allow users to create camera positions, filters, poses & overlays that can be used for taking awesome pictures in Sinespace using the snapshot system. In the tutorials below we will cover how to make and upload your own snapshot tools that you can sell in the shop or share with other users. #### Setting Up The Scene (Beginner)[​](#setting-up-the-scene-beginner "Direct link to Setting Up The Scene (Beginner)") In the drop down menu select About Sinespace and create a new region by clicking the Create region button in the box that appears. In the hierarchy select the landmark and disable it, we wont be needing it for this tutorial. We want to be able to preview what we are doing so at the top of the main window grab the game tab and drag it down and to the right to make a split screen as show above. In the hierarchy right click to add a camera to the scene. In the search bar above the project window search for 2017 male or female avatar, drag the model into the hierarchy. In your scene window use your mouse & scroll wheel to position yourself on the avatar, in hierarchy select the main camera and press cntrl-shift-f to focus the camera on the avatar. #### Creating Snapshot Filters[​](#creating-snapshot-filters "Direct link to Creating Snapshot Filters") Snapshot filters are used to change the post processing effects while using the snapshot tool, we use Unity's post processing tools to create an effect to upload to Sinespace. In order to see the changes we make to the post processing effects we need to add a post processing layer to the main camera. Select the camera in the hierarchy and click the add component button in the inspector, add the post processing layer component. In your project window right click and select create/post processing profile, name it custom profile (you can name this whatever you like). In the hierarchy select the Post Processing Settings and make sure Is Global is checked, set a high priority number 99999999 and then drag your custom profile from the project window into the profile section of the post processing volume component. **Important :** make sure that the layer at the top of the inspector is set to transparentFX. Click on the custom profile in the project window then in the inspector click add effect, for this tutorial we will only be using the color grading tools but you can add any effects you like. At this point we can check to see if the post processing effects are working by changing the post-exposure in the inspector window to an extreme value. You should now see an over exposed effect in our "preview window". If the post processing is not visible in the preview window click on the camera in the hierarchy and looking in the post processing layer component, ensure that the layer field is set to everything, also check that the layer is set to transparentFX when clicking on the post processing settings in the hierarchy (this setting can be found at the top of the inspector window). ![SnapshotFilter7.png](/assets/images/snapshotfilter7-99057c62bc48a6f68c36a1856bbdded3.png) Next we will create our filter effect, click on the custom post profile in the project window and reset the exposure back to 0, check the color filter checkbox and click in the color box to the right for this tutorial I have set the color to hex code #DF83FF. Next we will change some channel mixers settings, select the red filter tab and check the red/green/blue check boxes to enable them, set the values red -7, green - 57, blue 59. Select the blue channel tab and again set the red/green/blue check boxes to enable them, set the values red 12, green -12, blue 27. Now we will setup the blue channel, click the blue channel tab and enable the red/green/blue channel check boxes, set the values red 41, green 93, blue 172. Finally to finish off the effect we will set some of the other settings in the custom profile, set the following value : mode ACES, temperature 20.1, post-exposure 2.33, saturation -38.3, contrast -5.9. We are now ready to upload our effect to Sinespace, right click in the hierarchy and create an empty game object (name it as required), in the inspector click on the add component button and add the screenshot filter component, drag our custom profile from the project window into the post processing v2 field in the screenshot filter component. ![SnapshotFilter13.png](/assets/images/snapshotfilter13-b75589ffab4e7ae00408fd4467366af8.png) While still having our empty game object selected click on the add component button in the inspector and add a virtual goods component, in the type field set Custom, custom type is **InventoryCameraFilter** and category is effects/snapshot/filter. Fill in the rest of the virtual goods as required. Finally drag our empty game object from the hierarchy into the project window to prefab it, right click on the prefab and select upload to Sinespace (this can now be viewed on the preview server once processing is complete). #### Creating Snapshot Poses[​](#creating-snapshot-poses "Direct link to Creating Snapshot Poses") Snapshot poses allow us to be able to upload custom poses/animations that we can use in the snapshot tool in Sinespace. For this tutorial we will need to have created a pose or animation using an animation program or you can down load animations from a site such as . Drag your chosen animation into the project window and click on it, in the inspector under the rig tab make sure the animation type is set to humanoid and click apply. We need our animation to be looped so selected the animation tab in the inspector and check the loop time checkbox. If you have downloaded an animation from Mixamo we will need to change the animation so it is not read only, this is so that we can edit it later in the tutorial, click the arrow next to your animations prefab (blue box) click on the animation as arrowed above and click cntrl-D to duplicate it. You can now delete the original animation prefab as this is no longer required. We now need to be able to preview the animation inside of the editor so we can work with it, right click in the project window and select create/Animator Controller and name it Custom Controller. Select the 2017 avatar in the hierarchy and click on the add component button in the inspector, add an animator controller component and drag our custom controller into the controller field. Make sure the avatar has the correct 2015 profile for the avatar we are using either male/female. While still having the 2017 avatar selected click on the animator tab above the main scene window, if you don't have this tab your can right click on the scene tab and click add new tab/animator. Drag our animation into the animator window from the project window. Now select the animation tab above the project window, if you don't have this tab you can add it by right clicking the project tab and select add tab/animation. Now if you grab the white time line in the animator window while holding the left mouse button you can scrub through the time line, the animation will be shown on our avatar in the preview window. You can upload full animations to Sinespace for use in the snapshot system, for this tutorial I am going to create a static pose. Scrub through the time line and find a pose that you like then work through the time line and delete the key frames that are no longer needed until you have only that key frame left as pictured above. Our avatar looks a little miserable for a picture so lets give her a smile, in the animation window click the record button then in the hierarchy open up 2017 avatar and click on either the femalebody or malebody found under Geo\_GRP. In the inspector under the skinned mesh renderer open up the blend shapes menu by clicking the arrow next to blend shapes. We will change some of the mouth settings to make our avatar smile, for the tutorial i will set the mouth\_anim.mouth\_ah to 50 and the moth\_anim.mouth\_eee to 25, you can change other settings to suit. \*\*Warning : \*\* do not change anything that has slider in the name, this will break things in world. Our blend shape changes will now have been saved to the animation so we can click on the record button in the animation window to stop recording. --- ### Gestures - VFX #### Overview[​](#overview "Direct link to Overview") You can add colour treatments to your gesture using the Avatar Effect LUT script. You can add colour treatments to your gesture using the Avatar Effect LUT script. For more information on creating LUTs, see Unity's documentation here; \[] --- ### Multi-Person Animations #### Overview[​](#overview "Direct link to Overview") The process for setting up a multi-person gesture is the same as that for Gestures - Single Person Animation, BUT; Trigger Enable the trigger in the Avatar Effect Script. The process for setting up a multi-person gesture is the same as that for [Gestures - Single Person Animation](/sinespace-sdk/avatars/gestures/single-person-animation.md), BUT; ##### Trigger[​](#trigger "Direct link to Trigger") Enable the trigger in the Avatar Effect Script. Set the trigger radius to 4. \\
Users can initiate a two person gesture inworld with a visible circle around them. Please note that no animation or other prop, audio file or VFX, will be launched on any individual's desktop until all the components of the gesture have arrived and can be launched collectively; guaranteeing that multi-user gestures play in sync for every participant and all other observers in the region.
<
##### Avatar Multi Animation Effect Script[​](#avatar-multi-animation-effect-script "Direct link to Avatar Multi Animation Effect Script") Attach the Avatar Multi Animation Effect Script instead of the Avatar Effect Script;

Clip A / Clip B Drag the animation takes from the fbx files for each of your two characters into these fields. Clip A will play on the initiator of the gesture. Clip B will play on the recipient or guest. Distance Apart You can offset the characters here if you have not already defined the offset in via the root nodes of your models in your animation editing tool. Fix Avatar Heights If your gesture involves both characters engaging in a very prceise interaction, for instance shaking hands, you can align them using Fix Avatar Heights. Gestures played by tall and short avatars may not look correct otherwise. Start Time You can delay the initiation of the animations. IK Targets You can select one or more nodes on the avatars and impose an IK through the animation to correct for discrepancies in avatar sizes and shapes. For more information on on FBX settings and setting up gestures; [Gestures - Single Person Animation](/sinespace-sdk/avatars/gestures/single-person-animation.md) ##### Virtual Goods Script[​](#virtual-goods-script "Direct link to Virtual Goods Script") Fill out the product details in the Virtual Goods Script and submit your gesture to the staging server for review. for more information on the Virtual Goods Script go here; [Virtual Goods](/sinespace-sdk/components/virtual-goods.md) --- ### Props #### Overview[​](#overview "Direct link to Overview") In addition to animations and camera paths, there are a number of other components you to can add to speciflc points on the the timeline of a gesture, allowing you to create sophis In addition to animations and camera paths, there are a number of other components you to can add to speciflc points on the the timeline of a gesture, allowing you to create sophisticated and complex multi-person performances that can be deployed instantly anywhere. ##### Props[​](#props "Direct link to Props") Props might include; * Furniture; * Weapons; * Costume accessories; * Particle effects; * Floating text; * Other complex compound objects, up to and including entire sets. To add a prop to your gesture, add the "Create Object, Attach" component. You can add as many separate props as you want, each with their own attachment points or location, and each with their own start and end times. \\
Drag the prop itself into the Object field. Use Start Time and End Time fields to set when your prop spawns and despawns. For single person gestures leave the Participant field as Initator. For multi-person gestures you can select the Initiator or Recipient for each prop; so you can put a gun in both avatar's hands simultaneously, or set both their heads on fire... Use the destination drop down to attach your prop to any bone on the skeleton of the avatar. --- ### Set Up #### Overview[​](#overview "Direct link to Overview") Gesture Preview Scene Once you have imported the sinespace Editor Pack into Unity, you will find a Gesture Preview Scene. ##### Gesture Preview Scene[​](#gesture-preview-scene "Direct link to Gesture Preview Scene") Once you have imported the sinespace Editor Pack into Unity, you will find a Gesture Preview Scene. This scene contains two rigged character models and is set up to allow you to assemble and test your gestures. Add only one gesture into the scene at a time. ![Gesture Preview Scene.jpg](/assets/images/gesture-preview-scene-1c1f7d07ce94aacd37e3d260a5b7171d.jpg) ##### Animation formats[​](#animation-formats "Direct link to Animation formats") The sinespace virtual world uses the Unity game engine and supports animation files imported as part of a 3D Model file (such as FBX). If you are used to using BVH files there are utilities online that can convert from one format to the other. ##### Avatar Effect Scripts[​](#avatar-effect-scripts "Direct link to Avatar Effect Scripts") When you import an animation into Unity you will then add that animation to a game object. You can find samples for single person gestures and multi-person gestures in your project window. Go to Sample Art>Gestures and there will be two sample prefabs. Sample 1 is for single person and Sample 2 is multi-person. That game object has scripts added to it, depending on what you are doing with your gesture. Please see the [Single Person Gesture](/sinespace-sdk/avatars/gestures/single-person-animation.md) page and [Multi-Person Gesture](/sinespace-sdk/avatars/gestures/multi-person-animations.md) page for more information on how to set gestures up. ##### Virtual Goods Script[​](#virtual-goods-script "Direct link to Virtual Goods Script") Your gesture will also have a Virtual Goods Script attached, which allows you to add product information and submit the item to the store and / or your inworld inventory. For more information on the virtual goods script; [Virtual Goods](/sinespace-sdk/components/virtual-goods.md) --- ### Single Person Animation #### Overview[​](#overview "Direct link to Overview") Create Gesture Prefab In the project folder called Gestures (search for "Gestures" in project search) you will see a selection of templates you can duplicate, rename and modify. ##### Create Gesture Prefab[​](#create-gesture-prefab "Direct link to Create Gesture Prefab") In the project folder called Gestures (search for "Gestures" in project search) you will see a selection of templates you can duplicate, rename and modify. Highlight the "Sample 1 person template" file and click ctrl D to duplicate. Rename your new prefab in the project window, then drag it into the scene. ![](/assets/images/create-new-gesture-template-0fcbc67b6cdb57e5ae309a3cb4a7a3a6.jpg)
If you don't want to duplicate the template objects, you can also create an empty game object and then add the "Animate Single Avatar" or "Animate Multiple Avatars" components (which will automatically add the two scripts required) and then you also have to add the "Virtual Good" component. ![](/assets/images/singlepersonanimation-21277e373146ea0ceb291d6ea18a697f.jpeg) ##### Import FBX[​](#import-fbx "Direct link to Import FBX") When you import the .fbx file containing your animation you need to rig it. Click the rig tab in the inspector. Set the type to Humanoid. Set the Avatar Definition to Copy From Other Avatar Select the relevant sinespace avatar as the source (click the small circle to the right of the Source field.) ![](/assets/images/import-fbx-screenie-02-61448452729bee1ec8faf5b2c79ce94e.jpeg) Now click from the rig tab to the Animations tab. You should be able to see your animation in the preview window in the Inspector. You may wish to crop or modify the animation using Unity's tools in this panel; see here for more information on Unity's animation tools.
##### Avatar Effect Script[​](#avatar-effect-script "Direct link to Avatar Effect Script") Set the number of participants to 1. If your animation is specifically for a single gender then check "Is Gendered" and select Male or Female from the "Nominal Gender" dropdown. Leave the Trigger fields empty; these will be used with multi-person gestures. Tick loop if required; e.g. for dances. The user will be able to stop looping in-world by exiting the gesture.. ![](/assets/images/avatar-effect-script-1f835b3c7557d77c1749815207f6756e.jpeg) Other Avatar Effect Scripts [Gestures/Props](/sinespace-sdk/components/avatar-effect-object.md) [Gestures/FX](/sinespace-sdk/components/avatar-effect-lut.md) [Gestures/Take Snapshot](/sinespace-sdk/components/avatar-effect-snapshot.md) ##### Avatar Animation Effect Script[​](#avatar-animation-effect-script "Direct link to Avatar Animation Effect Script") Drag the animation take from within your fbx file into the Clip field. Leave "Participant" set to Initiator. You can use the start time to delay the start of the gesture. If your gesture involves interaction with fixed position prop (e.g. a door handle) or with precise two person gestures (e.g. shaking hands) you may wish to tick Fix Avatar Height. This will set the user's avatar height to the standard height for avatars in sinespace. ![](/assets/images/avatar-animation-effect-script-f6041d3e7929b3dba15de7dfde0f4f86.jpeg) ##### Preview gesture in scene[​](#preview-gesture-in-scene "Direct link to Preview gesture in scene") Once you have added the animation track to the Clip field in the Avatar Effects Script you can click play in Unity and see the gesture performed by the model in the scene. ##### Virtual Goods Script[​](#virtual-goods-script "Direct link to Virtual Goods Script") Fill out the product details in the Virtual Goods Script and submit your gesture to the staging server for review. for more information on the Virtual Goods Script go here; [Virtual Goods](/sinespace-sdk/components/virtual-goods.md) --- ### Visual FX #### Overview[​](#overview "Direct link to Overview") This component/script is accessed from the Unity Component menu, then Avatar Effects then select "Color Filter - LUT". This component/script is accessed from the Unity Component menu, then Avatar Effects then select "Color Filter - LUT". You can add colour treatments to your gesture using the Avatar Effect LUT script. When you import a texture to apply as a LUT you should apply the following settings to your .png file; Texture Type: Advanced Mapping: None Import Type: Default Bypass sRGB Sampling: ticked Generate Mip Maps: Off Wrap Mode: Clamp Filter Mode: Bilinear Aniso Level: 0 For more information on creating LUTs, see Unity's documentation here; [\[1\]](https://docs.unity3d.com/Manual/script-ColorCorrectionLookup.html) ##### Audio[​](#audio "Direct link to Audio") This component/script is accessed from the Unity Component menu, then Avatar Effects then select "Play Audio". You can add audio effects, synchronised with other events in the gesture, using the Audio Effect component; \\
For more information on audio files and Unity see here; [\[2\]](https://unity3d.com/learn/tutorials/topics/audio)
--- ### Materials, Sliders and Shaders #### Overview[​](#overview "Direct link to Overview") Making A New Material (\_note: this wiki page refers to the Unity standard shader only. #### Making A New Material[​](#making-a-new-material "Direct link to Making A New Material") (*note: this wiki page refers to the Unity standard shader only. Uploading custom shaders in space is permitted.*) To create a new material, right click in your project window, go to Create and choose Material. This will make a default gray material in your project window.
You can then drag this material onto the clothing item in the scene. You can change the colour of this material here: 1. Metallic Slider Using the metallic slider will let the Albedo colour control the colour of the specular reflection and most liight will be reflected as specular reflections. In more simplier terms, if you want to create something metallic, you would want to have the metallic slider high and also the smoothness slider high so that the material will reflect light like a metal does. 1. Smoothness Slider The smoothness slider will reduce the amount of shine and hardness from the clothing. For the t-shirt I made, I have set the smoothness slider to the lowest and also the metallic slider to the lowest so there is no reflective light or specular light coming from the material. You can play around with these sliders until you get the outcome you want. 1. Normal Map If you have made a high poly version of your clothing item, then you can make the normal map for it in your 3D software and apply it to your low poly item. You can add normal map images by dragging and dropping your normal map image from where you saved it into your project window, then dragging it into the normal map slot. Note: Make the normal map image a normal map texture first by clicking on the image and choosing normal map under the texture type in the import settings on the right hand side of the screen. 1. Height Map Height maps are usually used alongside normal maps, and they are used to give definition to surfaces where the texture maps are responsible for rendering bumps and protrusions. Add the height map the same way as a normal map, but drag the image into the Height Map slot. 1. Occlusion Map Occlusion maps are used to provide information for which areas on the clothing item will receive direct or indirect lighting. For example, if you make a metal buckle for a belt, you can add in an occlusion map to create shiner parts of the belt and parts that are darker. Add the Occlusion Map the same way as a normal map, but drag the image into the Occlusion slot. 1. Emission Emission controls the colour and intensity of light on your clothing item. If you set the emission to black, there will be no parts of the clothing that look lighter. If you want to make parts look lighter, you can set the emission to gray (for making parts slightly lighter) or white (for making parts look a lot lighter) I recommend not setting the emission to anything other than black for clothing that would be made from material like cotton, denim or brick, but it can be set for items made out of leather, PVC or metal. 1. Detail Maps Secondary Maps (or Detail maps) allow you to overlay a second set of textures on top of the main textures. You can apply a second Albedo colour map, and a second Normal map. These would be mapped on a much smaller scale and repeated many times across the object’s surface, compared with the main maps. The reason for this is to allow the material to have sharp detail when viewed up close, while also having a normal level of detail when viewed from further away. These detail maps are usually used for creating small details like tiny hairs on the skin, pores on the skin, or things like really small cracks in walls and floors. 1. Fresnel Effect One important visual cue of objects in the real world has to do with how they become more reflective at grazing angles. This is called the Fresnel effect. In the Standard shader there is no direct control over the Fresnel effect. Instead it is indirectly controlled through the smoothness of the material. Smooth surfaces will present a stronger Fresnel, totally rough surfaces will have no Fresnel. You want to set the smoothness higher for materials like reflective glass, leather, PVC, metals, anything in the real world that would have a hardness and reflectiveness to it. --- ### Skins #### Overview[​](#overview "Direct link to Overview") Skin is a texture image that replaces the default skin of your avatar. Skin is a texture image that replaces the default skin of your avatar. Skins can be re-made and uploaded in Sine Space using the [Virtual Goods](/sinespace-sdk/components/virtual-goods.md) component. ##### Avatar Skin[​](#avatar-skin "Direct link to Avatar Skin") You can download the default avatar skin template from the following link. * Sinespace avatar Skin: [Download](http://space-files.s3.amazonaws.com/sample-art/SkinArtistQuickpack.zip) ##### Importing Skin textures to Unity[​](#importing-skin-textures-to-unity "Direct link to Importing Skin textures to Unity") Once you have created the Skin save the PSD and import it back to Unity. ###### Note on importing assets[​](#note-on-importing-assets "Direct link to Note on importing assets") Unity uses a working folder called the "Assets Folder" - anything in this folder is accessible in Unity in the 'Project' panel. You can right-click in the 'Project' panel, and select 'Show in Explorer' (or 'Show in Finder' on MacOS) and view the files. To import the texture into Unity, simply save it into this folder. Unity will detect and import the texture when you tab back into it. Attention: Do not store the edited Skin in the 'Artist Project' folder, it will not be uploaded. (That folder is ignored during uploads) ##### Turning the textures into a skin[​](#turning-the-textures-into-a-skin "Direct link to Turning the textures into a skin") A skin is a special type of Clothing Item - as of Editor Pack 12, we strongly recommend uploading skins using the new 'Tattoo System' which is documented below. #### Path A. Upload as Tattoo[​](#path-a-upload-as-tattoo "Direct link to Path A. Upload as Tattoo") *Video Option: This topic is covered under* [*Masterclass 17*](https://www.youtube.com/watch?v=s55zKHo_hdo) Create a new blank gameobject using GameObject->Create Empty from the menu ![NewGameObject.jpg](/assets/images/newgameobject-de81fd5edd2d72c09e433287cc3560eb.jpg) On the right hand side of the screen, locate the "Inspector" panel, and add a Clothing Item Settings component to this new empty object ![AddClothingItem.jpg](/assets/images/addclothingitem-07b731f356d0f26576042cda2dc4df6d.jpg) Locate the Tattoo section on this component ![TattooSection.jpg](/assets/images/tattoosection-07be30de22b339a660330aa30dbb12a8.jpg) You now need to adjust the settings to indicate this is a skin; the key settings are: * Skeleton: Make sure to set this Male or Female * Enabled: Make sure this is ticked * Type: Set this to Base Skin * Albedo: Drag the base diffuse/albedo texture into this slot from the Project panel ![SetupTattoo.jpg](/assets/images/setuptattoo-97f6ae679495246045de809f11903254.jpg) NOTE: If you are using an older Editor pack, you will also need to tick 'Only Contains Skin' to get it to process correctly, you can find that on the Skin tab. (Newer editor packs such as 12p13 should not require this; however if you encounter an error during processing, you may want to try it.) ![OlderEditorPacks.jpg](/assets/images/oldereditorpacks-912093b6a7d8f1d62681c596bd219b1b.jpg) The next step is to format it as a item - fill in details on the name, pricing, etc. Add the virtual good component from the 'Add Component' button ![VirtualGood.jpg](/assets/images/virtualgood-54afdbab8be3d9aa08b9bf1b19237ca1.jpg) You will then need to adjust some settings - fill in the form until all the red exclamation marks have vanished. ![VirtualGood2.jpg](/assets/images/virtualgood2-d8c4ed43c4eff630ddd4ebfa3442dc11.jpg) Finally, to save this to disk (so that it is stored as a file, versus simply an object in your scene), click the 'Fix Now' button to convert it to a prefab; be aware the objects name (at the top) will be used in the filename, so you may want to rename the object prior to clicking this button. ![VirtualGood3.jpg](/assets/images/virtualgood3-dc19b1368be5dbe64445351fedabc7d5.jpg) You may now upload the item from the Upload tab, this will upload it to the world directly. ##### Previewing (Optional)[​](#previewing-optional "Direct link to Previewing (Optional)") If you wish to preview it, prior to uploading; you can use the Clothing Previewer to test an item Create a new GameObject ![NewGameObject.jpg](/assets/images/newgameobject-de81fd5edd2d72c09e433287cc3560eb.jpg) Add the Statue and Clothing Previewer components to the object Now, in the Project Panel, locate your object ![FindTheObject.jpg](/assets/images/findtheobject-c818544605da138330e884c283313b13.jpg) You can then drag the object into the previewer slot. Set the appropriate gender on the 'Statue' component (note: the Statue component can be used for NPCs, or previewing against a specific avatar - see more in the NPC pages of this wiki) ![Previewer.jpg](/assets/images/previewer-55550a0008689670858cd1c42bae978d.jpg) Hit the 'Play' button in Unity, and the avatar should preview, while wearing the item. #### Path B. Upload Entire Material[​](#path-b-upload-entire-material "Direct link to Path B. Upload Entire Material") If you need to use a custom shader or material for your skin, follow this procedure. Note this method may not be as compatible with tattoos and makeup layers. you can create a new material and drag skin texture and normal map in normal map slot. Once the material is created you can chose the material shader for skin from built in unity standard, custom shader or SineWave skin shader. SineWave Skin Shader * Main Color - Sets the overall color of the skin. * Specular Color - Tints specular highlights of the skin. * Shininess - Sets the shine amount of the skin. * Rim Power - how rim lighting spreads around the edges of the model. * Rim HDR - Adds a boost to rim lighting, to enable it push into HDR values (i.e. Brighter than white) for bloom. * Normal Power - controls power of normal map (allowing them to be more/under represented) * Tessellation - allows DX11 Tessellation which smooth's geometry when camera is up close. * Specular Amount - Sets the specular amount. * Gloss Amount - Sets how glossy the skin should look. * Smoothness - controls specular highlights on PBR platforms (higher = tighter highlights), correlates with Standard shader. * Occlusion - controls ambient occlusion. * Loading color - For internal use. PLEASE IGNORE THIS SETTING. ![Setting material.jpg](/assets/images/setting-material-715f5e8a150bec37dfdf5e689330ffe4.jpg) ##### Using Make clothing component to fit the Skin[​](#using-make-clothing-component-to-fit-the-skin "Direct link to Using Make clothing component to fit the Skin") Once the skin material is created, it needs to be converted to fit the skeleton. Create an empty game object in the scene and add the Clothing Item Settings Component to it. Skeleton Selection Chose the relevant Skelton for the clothing item. Please note Space supports multiple third party skeletons as well as it's own native male and female models. Slots If you are creating only skin, select Skin Base slot. If you want the skin to have more than just skin select other applicable slots. ![Skin slot.jpg](/assets/images/skin-slot-8371c1704369b9f7ca0cfecf0c1eb066.jpg) Skin Setup Select Only contains skin if you are uploading skin only. If you are doing a combined outfit Don't select this. * Note : if you are not making just skin you will have to click on Convert to skinned button later. if you are creating just skin this step is not needed and the button will disappear as soon as you select Skin only. Replacement Skin Set the number of material the skeleton you are using has. Sine Space male and female skin only has 1 material; if you have selected that as the skeleton Set the size to 1. After the size is set. Drag the skin material in the material slot. ![Skin Setup.jpg](/assets/images/skin-setup-93bc7bf2f0b4d769f5cf6da5ebf67b29.jpg) ##### Add virtual goods script[​](#add-virtual-goods-script "Direct link to Add virtual goods script") Attach the virtual goods script and complete the submission process. See [Virtual Goods](/sinespace-sdk/components/virtual-goods.md) for more details on the virtual goods script. ##### Video Tutorial[​](#video-tutorial "Direct link to Video Tutorial") To learn more about creating and uploading skins, watch the tutorial below: [YouTube video player](https://www.youtube.com/embed/vSuhAmnqZJE) --- ### Unified Clothing And Skin (Metal and Tessellate) #### Overview[​](#overview "Direct link to Overview") The Unified SkinClothing HighEnd shader is a shader used for adding depth and substance to your clothing and skin (metal and tessellate feature). The Unified SkinClothing HighEnd shader is a shader used for adding depth and substance to your clothing and skin (metal and tessellate feature). This shader is best used on high end machines. You can use the basic Unified SkinClothing shader if you have a PC with lower performance. To use this shader on your clothing and skin items, search for "Unified" in your Unity project window. Create a new material by right clicking in the project window and select 'Create>Material'. Drag the Unified SkinClothing HighEnd shader on to the new material and this will add the shader to the material. Now to work with the settings. NOTE: The name of the shader will now show as Unified Clothing And Skin (Metal and Tessellate)
* Main Color - Sets the overall color of the skin. * Specular Color - Tints specular highlights of the skin. * Shininess - Sets the shine amount of the skin. * Rim Power - how rim lighting spreads around the edges of the model. * Rim HDR - Adds a boost to rim lighting, to enable it push into HDR values (i.e. Brighter than white) for bloom. * Normal Power - controls power of normal map (allowing them to be more/under represented) * Tessellation - allows DX11 Tessellation which smooth's geometry when camera is up close. * Specular Amount - Sets the specular amount. * Gloss Amount - Sets how glossy the skin should look. * Smoothness - controls specular highlights on PBR platforms (higher = tighter highlights), correlates with Standard shader. * Occlusion - controls ambient occlusion. * Loading color - For internal use. PLEASE IGNORE THIS SETTING. But has the addition of a few more settings: * Height Map: \- Single channel (R) texture with height distances encoded on it, you can use a heightmap exported from your 3D package (either Quixel/Substance Painter or from Maya/Max/Blender) - should be derived from the same thing building the normal maps. Use the height map for encoding fine details (such as for example complex textured fabrics) that are too small or high poly to justify using actual geometry. * Height: \- How much in meters to scale the model details by the heightmap. A value of 0.01 is 1cm. Typically you want 0.005 or so. * Height Offset: \- This will subtract this value from the heightmap values uniformly; you can use for tweaking the visual appearance. Note: resulting values less than zero are treated as zero. * Tessellation Edge Length: \- This defines the maximum size of a triangle on screen in pixels. If a triangle is larger than this many pixels on screen, it will be subdivided. Do not go below 15. * Tessellation Phong Strength: \- This defines how "smooth" the surface should become, values larger than 0.2-0.3 will often create weird balloons. Typical values range from 0 (no smoothing corners/edges) to 0.1 (slight smoothing)
*NOTE*: When using this shader, make sure to tick "Generate Lightmap UVs" and disable Mesh Compression on your model in the Unity Model Importer screen ( R ) = (R) --- ### Uploading Tattoos #### Overview[​](#overview "Direct link to Overview") This a step by step tutorial on how to upload tattoos to Sinespace. This a step by step tutorial on how to upload tattoos to Sinespace. 1\. In Photoshop or similar, open the sinespace skin texture file you want to work on (male or female) from this pack - [| Download](http://space-files.s3.amazonaws.com/sample-art/SkinArtistQuickpack.zip) 2\. Create a new layer (in Gimp make sure the layer is set to Transparency) and add your tattoo image to that layer. 3\. Place the tattoo where you want it on the skin texture file ![Photoshopss.png](/assets/images/photoshopss-8bd8968155234dd329f689f5cccc2a1c.png) 4\. Save this layer as a .png or another file format that saves as transparent such as a psd file in Photoshop. In Gimp you will have to hit β€˜File, Export’ then save it as β€˜Tattoo\_Chest.png’ for example. 5\. Once saved, open Unity. 6\. In Unity, create a new folder called Tattoo so you know where to find the png for the tattoo. You can do this by right clicking in the project window and hit β€˜Create’ then β€˜New Folder’. 7\. Add the png of the tattoo to the new folder you just created. You can do this by right clicking in the new folder and hit β€˜Import New Asset’ and click on the png file. OR, just drag and drop the png into this new folder. 8\. In the Unity hierarchy, right click and hit β€˜Create Empty’or click on 'Game Object' and choose Empty at the top of Unity. You can name this empty object to something like β€˜Chest Tattoo’ or whatever you want to name it as. ![Unityempty.png](/assets/images/unityempty-bc0679ab3952e2740c92d44079f03f0b.png) 9\. Make sure in Transform the position is set to 0,0,0. ![Transform0.png](/assets/images/transform0-e7db5355c017d3fd02e083a7cf1f0b52.png) 10\. Add the β€˜Clothing Item Setting’ component to the empty object by clicking β€˜Add Component’ and search for β€˜Clothing Item Setting’ 11.In the clothing item settings, choose the right base avatar skeleton (this will be the same as the skin texture) 12\. Check the Tattoo and Makeup setting under the clothing item settings. Set the settings to these: ![Tattoomakeup.png](/assets/images/tattoomakeup-959b5c32e4d6fb0acb786adfe3f79773.png) For the albedo, drag in the .png of the tattoo. 13\. Once done, add the β€˜Virtual Good’ component. Once this added, drag your empty object from the hierarchy to the project window to make it a prefab. ![Prefabtat.png](/assets/images/prefabtat-8a8f0d14cb4bc89c307ee4a6a95164b5.png) 14.Click on the prefab in your project window, then fill in the virtual good information. 15\. Set the Type in Virtual good Basics to Clothing, and Category to Clothing/Skin/Tattoos then fill in the rest of the virtual good information and click auto submission to upload to Sinespace. You can check on the progress of your upload at [curator.sine.space](https://curator.sine.space/) --- ### AnimatedVendorConsole #### Overview[​](#overview "Direct link to Overview") Fields Radius Set the proximity radius Usage There is an example in Sample art/vendor folder of the Editor Pack. ![](/assets/images/400px-animatedvendorconsole-d3015f9a852f4753909615a8f9cf7255.jpg) info This component is itself a legacy component (and may be depreciated and removed in the future), or is likely to get an update in the future. #### Fields[​](#fields "Direct link to Fields") ###### Radius[​](#radius "Direct link to Radius") Set the proximity radius #### Usage[​](#usage "Direct link to Usage") There is an example in Sample art/vendor folder of the Editor Pack. Radius Radius at which the animation will trigger. eg, if the radius is set to 5, when the avatar comes within 5 meters of the vendor the vendor animation will trigger.
--- ### AnimationVendor #### Overview[​](#overview "Direct link to Overview") Fields **Play Clickable** Place the play button object/canvas here. ![](/assets/images/400px-animationvendor-e0bd3ad51cbaf53e5e1fa0d15ed0f351.jpg) #### Fields[​](#fields "Direct link to Fields") ###### **Play Clickable**[​](#play-clickable "Direct link to play-clickable") Place the play button object/canvas here. ###### **Buy Clickable**[​](#buy-clickable "Direct link to buy-clickable") Place the buy button object/canvas here. ###### **Mannequin**[​](#mannequin "Direct link to mannequin") Place the avatar to animate here. ###### **Click to start**[​](#click-to-start "Direct link to click-to-start") If unchecked, the animation will always play. ###### **Item ID**[​](#item-id "Direct link to item-id") Enter the item ID here. --- ### ATM #### Overview[​](#overview "Direct link to Overview") Add this component to an ATM mesh / NPC statue. ![](data:image/jpeg;base64,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) info *To find the ATM component you need to search in the Editor Pack with the name "Buy Gold".* Add this component to an ATM mesh / NPC statue. Any user that clicks on it will get the Purchase Gold interface --- ### AudioReactive #### Overview[​](#overview "Direct link to Overview") To set up your scene in Unity for the audio reactive components, you need to first either drag an audio file from your PC into the project window, and then into the hierarchy, or for music streams, you need to (info). To set up your scene in Unity for the audio reactive components, you need to first either drag an audio file from your PC into the project window, and then into the hierarchy, or for music streams, you need to (info). ##### Audio Reactive Transform[​](#audio-reactive-transform "Direct link to Audio Reactive Transform") This component can be attached to the 3D object you want to react to the music and then used to transform the 3D object in time to the audio. You can transform the object within the component, so you can set the object to scale, rotate or move in certain directions. To add this component to your object, select the object in your hierarchy and under the Inspector window on the right, click on 'Add component'. Search for audio reactive and choose 'Audio Reactive Transform'. ![Audiotransform.jpg](/assets/images/audiotransform-c12ed86b7db1c041dee8380f34196a9c.jpg) ###### Band Min and Band Max[​](#band-min-and-band-max "Direct link to Band Min and Band Max") There are different types of bands for the different frequencies in audio. For example, if you want the object to move to only the bass of the audio, you will need to set the band min slider to 0, and the band max to 1. You can play around with the different values until it matches the audio band you want the object to move to. ###### BPM Window[​](#bpm-window "Direct link to BPM Window") The BPM Window Limit defines how many seconds to analyse for determining the BPM. So, for example, if you set this to 3, it will listen to the last 3 seconds, if you set it to 10, it will listen to the last 10 seconds. ###### Limit Increase/Decrease[​](#limit-increasedecrease "Direct link to Limit Increase/Decrease") The limit increase/decrease determines how quickly the values can change. If you have fast paced music and want the object you have to react faster to the audio, you can change the limit increase/decrease to 10,000+ to make the object move very quickly in time to the audio. ###### Min Value/Max Value[​](#min-valuemax-value "Direct link to Min Value/Max Value") These determine how quick the reactions are, so you might want to set these values to your liking. ###### Mode[​](#mode "Direct link to Mode") This sets the mode to BPM or Band. ###### Position[​](#position "Direct link to Position") This will change the objects position when checked. You can set how far the object will move and in which direction on the Z,Y and X axis in time to the audio. ###### Rotation[​](#rotation "Direct link to Rotation") This will change the direction in which the object is rotated when checked. Again, this will set which way the object will rotate on the Z,Y and X axis in time to the audio. ###### Scale[​](#scale "Direct link to Scale") This will change the size/scale of the object when checked. The object can be scaled in any direction on the Z,Y and x axis separately, or you can set the same value in all of the axis's to make the object scale uniformly. #### Audio Reactive Lighting[​](#audio-reactive-lighting "Direct link to Audio Reactive Lighting") Audio reactive lighting will enable lighting to react to the audio you choose. Audio reactive lighting will work with lights which don't need to be baked, such as spot lights, directional lights and point lights. To add the audio reactive lighting to your light, click on the light you want to use in your hierarchy, and under the Inspector window, click on 'Add Component'. Search for audio reactive and choose 'Audio Reactive Light'. ![Audioreactive.png](/assets/images/audioreactive-a0dab2b34db819228640363e8ca63f5c.png) ###### Band Min and Band Max[​](#band-min-and-band-max-1 "Direct link to Band Min and Band Max") There are different types of bands for the different frequencies in audio. For example, if you want the object to move to only the bass of the audio, you will need to set the band min slider to 0, and the band max to 1. You can play around with the different values until it matches the audio band you want the object to move to. ###### BPM Window[​](#bpm-window-1 "Direct link to BPM Window") The BPM Window Limit defines how many seconds to analyse for determining the BPM. So, for example, if you set this to 3, it will listen to the last 3 seconds, if you set it to 10, it will listen to the last 10 seconds. ###### Limit Increase/Decrease[​](#limit-increasedecrease-1 "Direct link to Limit Increase/Decrease") The limit increase/decrease determines how quickly the values can change. If you have fast paced music and want the object you have to react faster to the audio, you can change the limit increase/decrease to 10,000+ to make the object move very quickly in time to the audio. ###### Min Value/Max Value[​](#min-valuemax-value-1 "Direct link to Min Value/Max Value") These determine how quick the reactions are, so you might want to set these values to your liking. When working with lighting, you might want to lower these values so the lighting colors blend quickly together. For example, setting the min value to 0, and the max value to 0.1, will mean that lights react quickly to the audio and they also blend and change colors faster. ###### Mode[​](#mode-1 "Direct link to Mode") This sets the mode to BPM or Band. ###### Range[​](#range "Direct link to Range") When range is checked, this will change the distance range of the light. For example, set the min range to 1 and max to 5 for a small circle of light. ###### Animate Color[​](#animate-color "Direct link to Animate Color") When this is checked, this will enable the light to blend the min color and max color you have chosen. ###### Intensity[​](#intensity "Direct link to Intensity") This will change the intensity of the light. The lower the values, the dimmer the light will be, and the higher the values are, the brighter the light will be. #### Audio Reactive Animation[​](#audio-reactive-animation "Direct link to Audio Reactive Animation") Audio reactive animation will enable a 3d object of your choice to move to audio. This component has a bit more to it than the other audio reactive components, but it is still a simple process to set up. Click on your object in the hierarchy, and under the Inspector window, click on β€˜Add Component’ and search for β€˜Audio’ then choose β€˜Audio Reactive Animation’. When this is done, click on β€˜Window’ at the top of Unity. On the drop-down menu, choose β€˜Animation’. This will add an Animation tab at the bottom of the screen. ![Animationtab3.png](/assets/images/animationtab3-f97ff83e33feb776731468e4bc947cb0.png) Click on β€˜Create’ in the animation tab, and when the Explorer opens, save the animation anywhere you want to save it. Now in the Animations tab, click on β€˜Add property’. This will open up a menu with three options; Transform, Mesh Renderer and Box Collider. For audio reactive objects, the best option to choose are Transform and Mesh renderer. ###### Transform[​](#transform "Direct link to Transform") Transform has more options on the drop down menu. To expand Transform, click on the arrow next to Transform. You will see three more options. ###### Position[​](#position-1 "Direct link to Position") This will allow you to change the position of the object along the X,Y and Z axis. ###### Scale[​](#scale-1 "Direct link to Scale") This will scale the object along the X,Y or Z axis, but also let you scale uniformly. ###### Rotation[​](#rotation-1 "Direct link to Rotation") This will rotate the object. ###### Mesh Renderer[​](#mesh-renderer "Direct link to Mesh Renderer") Mesh renderer is used for changing the object’s color or material. When you click on the arrow next to mesh renderer, this will show a lot of options, but they are all related to materials and color. Choose from either one of the transform options or mesh renderer options, and then click on the β€˜+’ sign next to the option. You can add more than one transform option or mesh renderer option to make the animation more complex. I have chosen to scale to my object, so I clicked on the plus sign, and two diamond shapes will now show in the animations tab on the timeline. These diamonds are key frames for the animation. The timeline is measured in frames and in seconds. Click on the key frame at the beginning of the timeline, and you will that it highlights blue. To make sure that the scale values you put in show up in your animations, put the scrubber (red line) over the key frame. ![Scrubberkeyframe.jpg](/assets/images/scrubberkeyframe-688dc3e74e6a736bac4d9c25231626a0.jpg) There is another key frame at the end of the timeline. Drag the scrubber to this key frame, and then change the values of scale again. I am changing mine to 2,2,2. If you want to add more keys, move the scrubber to the position on the timeline where you want to add it, and right click near the scrubber and choose β€˜Add Key’. The more keys you add, the more precise the movements will be. Here is my finished timeline. ![Finishedtimeline.jpg](/assets/images/finishedtimeline-8981efbb29d29dbfd03e481b65a3fe81.jpg) I have just made a very simple scale transition from 1,1,1 at the beginning to 2,2,2 at the end. #### Making the Animation work with Audio[​](#making-the-animation-work-with-audio "Direct link to Making the Animation work with Audio") To make the animation work with the audio, you now need to click on β€˜Window’ at the top of Unity and choose β€˜Animator’. When the Animator window is open, it will look like this, with the name of your object and the animation type in an orange box. ![Animator.jpg](/assets/images/animator-7ae946871f086b79c6935f0a9c5963c1.jpg) Click on your animation in the orange box. On the left hand side, you will see β€˜Layers’ and β€˜Parameters’. ![Layersandparameters.jpg](/assets/images/layersandparameters-90a8b465aeac220eafb03b26c1f9f39e.jpg) Click on Parameters if it isn’t already selected, and then click on the β€˜+’ sign underneath. ![Plussign.jpg](/assets/images/plussign-caf0c53a0b412b00ff756d8d696aff5e.jpg) When menu appears, choose β€˜Float’. This will show a β€˜New Float’ directly underneath the plus sign. Rename this float β€˜Audio’, exactly as it is shown here, with a capital A. Now, click on the orange box again, and in the Inspector window, you will see these settings. ![Animatorinspsettings.jpg](/assets/images/animatorinspsettings-5b5224709f8279b1701e50937aec0b3d.jpg) You can change the speed of the animation if you want it to be faster or slower, but for this example I am keeping mine on the default of 1. In the Multiplier setting, click on Parameter next to it, and this should automatically choose β€˜Audio’. The animation is set up to work with the Audio! Go back down to your Animation tab, and un-check the record button, then click on your Scene tab. Now you can click on β€˜Play’ and see if the Animation is working with the Audio. You will need to select the band you want the object to react to in the Audio Reactive Animation component in the Inspector window. You can adjust the settings in the Audio Reactive Animation component until you are happy with the result. ##### Audio Reactive Material[​](#audio-reactive-material "Direct link to Audio Reactive Material") *Note*: Audio Reactive Material is working in the experimental editor pack --- ### AvatarAnimationEffect #### Overview[​](#overview "Direct link to Overview") Fields Clip Add the animation clip here Participant sets the participant to initiator or receiver Start Time Sets the starting time of the animation Fix Avatar height Force sets av ![](/assets/images/400px-avataranimationeffect-e34b2ce0e135c43f8e48e111f971f27a.jpg) #### Fields[​](#fields "Direct link to Fields") ###### Clip[​](#clip "Direct link to Clip") Add the animation clip here ###### Participant[​](#participant "Direct link to Participant") sets the participant to initiator or receiver ###### Start Time[​](#start-time "Direct link to Start Time") Sets the starting time of the animation ###### Fix Avatar height[​](#fix-avatar-height "Direct link to Fix Avatar height") Force sets avatar height to standard #### Usage[​](#usage "Direct link to Usage") Click on Add Component under the Inspector window, and search for Animate Single Avatar. You can chose whether the participant is an initiator or receiver. Drag the animation taken from within your Animation fbx file into the Clip field. You can use the start time to delay the start of the gesture. If your gesture involves interaction with fixed position prop (e.g. a door handle) or with precise two person gestures (e.g. shaking hands) you may wish to tick Fix Avatar Height. This will set the user's avatar height to the standard height for avatars in Space. For details, check [how to set up an gesture](/sinespace-sdk/avatars/gestures.md) and [create a single animation](/sinespace-sdk/avatars/gestures/single-person-animation.md). --- ### AvatarAudioEffect #### Overview[​](#overview "Direct link to Overview") Fields Trigger time set the start time of audio. ![](data:image/jpeg;base64,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) #### Fields[​](#fields "Direct link to Fields") ###### Trigger time[​](#trigger-time "Direct link to Trigger time") set the start time of audio. ###### Effect[​](#effect "Direct link to Effect") add the audio file here. ###### Volume[​](#volume "Direct link to Volume") Sets the volume of the audio. #### Usage[​](#usage "Direct link to Usage") You can add audio effects, synchronized with other events in the gesture, using the Audio Effect component. Click on Add Component under the Inspector window, and search in the search bar for Play Audio. You can set the trigger time of the audio, for example, if you had chosen a high five animation, you want to trigger the time of the clap sound to the gesture animation. Effect is where you add the sound clip for the animation. Volume is used to set the audio volume. --- ### AvatarEffect #### Overview[​](#overview "Direct link to Overview") Fields Participants Sets no of participants Is Gendered Lets user choose Nominal gender Nominal Lets user choose Nominal gender Uses Radius Allows you to choose area radius Entry R ![](/assets/images/400px-avatareffect-8ea29d12bac5aae353434f4f7742a7d8.jpg) #### Fields[​](#fields "Direct link to Fields") ###### Participants[​](#participants "Direct link to Participants") Sets no of participants ###### Is Gendered[​](#is-gendered "Direct link to Is Gendered") Lets user choose Nominal gender ###### Nominal[​](#nominal "Direct link to Nominal") Lets user choose Nominal gender ###### Uses Radius[​](#uses-radius "Direct link to Uses Radius") Allows you to choose area radius ###### Entry Radius[​](#entry-radius "Direct link to Entry Radius") Lets you enter radius; this needs entry radius checked ###### Looped[​](#looped "Direct link to Looped") Sets animation to be looped. #### Usage[​](#usage "Direct link to Usage") When you import an animation into Unity you will then add that animation to a game object (there are templates in the Gestures folder in your project). That game object has scripts added to it, depending on what you are doing with your gesture.
click on Add Component and search for AvatarEffect in the search bar to add animation effects to your avatar.
The settings under this component include: * Participants- This allows to change from 1 to 2 participants * Is Gendered- This allows you to choose whether or not the gesture is gender specific * Nominal Gender- You can choose which gender is nominal, but it will still play with both genders. * Trigger: * Uses Radius: This means the gesture will use a radius of an area * Entry Radius: You can set the entry radius amount for the gesture area --- ### AvatarEffectCamera #### Overview[​](#overview "Direct link to Overview") Fields Rail set camera rail path Offsets Sets camera in relation with avatar Tracking targets Usage Click on Add Component under the Inspector window, and search for Camera Follow Character in the search bar. ![](/assets/images/400px-avatareffectcam-51d9f2d0afbdad2f64d5b2683dfae803.jpg) #### Fields[​](#fields "Direct link to Fields") ###### Rail[​](#rail "Direct link to Rail") set camera rail path ###### Offsets[​](#offsets "Direct link to Offsets") Sets camera in relation with avatar ###### Tracking targets[​](#tracking-targets "Direct link to Tracking targets") #### Usage[​](#usage "Direct link to Usage") Click on Add Component under the Inspector window, and search for Camera Follow Character in the search bar. This component has a few settings: Rail Type - linear will move the camera straight from start point to end point. Rotation will move around the avatar. Offsets The offsets allow you to place the camera in relation to the avatar. Y+ is up. Z+ is forward. So; X0, Y1, Z2 will put the camera 1 meter above ground, 2 meters in front of the avatar. Tracking Options The tracking options will animate the camera in line with the selected bone (Tracking target). Tracking Target Start / End Avatar - For two person gestures you can move the camera target from one avatar to the other. Start - End Target - You can move the camera's focus from one bone to another over the duration of the gesture.
For more info and examples, check [here](/sinespace-sdk/avatars/gestures/animated-cameras.md). --- ### AvatarEffectCameraMovement #### Overview[​](#overview "Direct link to Overview") Fields Legacy animation clip drag animation here Child name name of camera in FBX Target name Name of the target camera Tweak axis tweaks orientation of the imported FBX in unity T ![](/assets/images/500px-cameramovement-53f52c1b2348def60ccbd3a1f4397360.jpg) #### Fields[​](#fields "Direct link to Fields") ###### Legacy animation clip[​](#legacy-animation-clip "Direct link to Legacy animation clip") drag animation here ###### Child name[​](#child-name "Direct link to Child name") name of camera in FBX ###### Target name[​](#target-name "Direct link to Target name") Name of the target camera ###### Tweak axis[​](#tweak-axis "Direct link to Tweak axis") tweaks orientation of the imported FBX in unity ###### Tweak position[​](#tweak-position "Direct link to Tweak position") Tweaks position of the imported FBX in unity ###### Ignore Rotation[​](#ignore-rotation "Direct link to Ignore Rotation") Ignores rotation of FBX ###### Start Time[​](#start-time "Direct link to Start Time") Sets the start of animation ###### End Time[​](#end-time "Direct link to End Time") Sets the end time of the animation #### Usage[​](#usage "Direct link to Usage") You can apply animation from an fbx file to the camera using the Avatar Effect Camera Movement Script. Click on Add Component under the Inspector window, and search for Camera Follow Path in the search bar. This component has a few settings:
* Legacy Animation Clip Drag the fbx file containing your animation into the Legacy Animation Clip field. See below for FBX settings. * Child name The name of the camera in your FBX file * Target name The name of the camera target in your FBX file * Tweak Axis Unity's orientation is; Y+ = Up Z+ = Forward If your files export from your animation editor with a different orientation you can align to achieve your desired orientation using the Tweak Axis fields. * Offset / Ignore rotation Use these if you want to make universaal adjustments the animation in the editor. * Start time / End time Set the end time to the same as your animation file. For more info and examples, check [here](/sinespace-sdk/avatars/gestures/animated-cameras.md). --- ### AvatarEffectLUT #### Overview[​](#overview "Direct link to Overview") Fields LUT Image Drag LUT image here Start Time Start time of LUT effect End Time End time of LUT effect Usage Click on Add Component Under the Inspector window and search for Color LUT in the search bar. ![](/assets/images/400px-lut-ba74a0b62b1f6763b7266ea9d13d9509.jpg) #### Fields[​](#fields "Direct link to Fields") ###### LUT Image[​](#lut-image "Direct link to LUT Image") Drag LUT image here ###### Start Time[​](#start-time "Direct link to Start Time") Start time of LUT effect ###### End Time[​](#end-time "Direct link to End Time") End time of LUT effect #### Usage[​](#usage "Direct link to Usage") Click on Add Component Under the Inspector window and search for Color LUT in the search bar. This has the settings; * LUT Image- This is the image used for the LUT. * Start time- Start time of the image playing along with the gesture. * End time- End time of the image playing along with the gesture. For more information on how to create the images for the LUT, please go to this page [Gestures/FX](/sinespace-sdk/avatars/gestures/visual-fx.md) --- ### AvatarEffectObject #### Overview[​](#overview "Direct link to Overview") Fields Object drag the prop here Start Time Spawn time of the prop End Time DE spawn time of the prop Participant Set the participant type initiator/receiver Destination Choose the ![](/assets/images/400px-aveffectobj-7109bc60f588bf3b8a9260449679e2dd.jpg) #### Fields[​](#fields "Direct link to Fields") ###### Object[​](#object "Direct link to Object") drag the prop here ###### Start Time[​](#start-time "Direct link to Start Time") Spawn time of the prop ###### End Time[​](#end-time "Direct link to End Time") DE spawn time of the prop ###### Participant[​](#participant "Direct link to Participant") Set the participant type initiator/receiver ###### Destination[​](#destination "Direct link to Destination") Choose the bone on which the prop attaches to #### Usage[​](#usage "Direct link to Usage") Click on Add Component under the Inspector window, and search for Create object attach in the search bar. You can add as many separate props as you want, each with their own attachment points or location, and each with their own start and end times. Drag the prop itself into the Object field. Use Start Time and End Time fields to set when your prop spawns and despawns. For single person gestures leave the Participant field as Initator. For multi-person gestures you can select the Initiator or Recipient for each prop; so you can have them sit down simultaneously, or have them both drop on the floor. Use the destination drop down to attach your prop to any bone on the skeleton of the avatar, for example, if you wanted an avatar to be holding a whip, you would attach it to the hand bone. --- ### AvatarEffectSnapshot #### Overview[​](#overview "Direct link to Overview") Fields Trigger Time Sets the trigger time. ![](/assets/images/400px-avatarscreenshot-cfe186a54df08f920e22649adcea5a11.jpg) #### Fields[​](#fields "Direct link to Fields") ###### Trigger Time[​](#trigger-time "Direct link to Trigger Time") Sets the trigger time. #### Usage[​](#usage "Direct link to Usage") It will call the snapshot function at the trigger time you set here after start the effect. The snapshot window is the one as usual, where you can make the snapshot as your profile photo, or upload it to your library or other supported site. --- ### AvatarMultiAnimationEffect #### Overview[​](#overview "Direct link to Overview") Fields Clip A Drag the Initiator animation here Clip B Drag the receiver animation here Distance Apart Set the distance between avatars Fix avatar heights Sets avatar height to sta ![](/assets/images/450px-multianimation-52a168dd063c3bb0046f758f54f724c7.jpg) #### Fields[​](#fields "Direct link to Fields") ###### Clip A[​](#clip-a "Direct link to Clip A") Drag the Initiator animation here ###### Clip B[​](#clip-b "Direct link to Clip B") Drag the receiver animation here ###### Distance Apart[​](#distance-apart "Direct link to Distance Apart") Set the distance between avatars ###### Fix avatar heights[​](#fix-avatar-heights "Direct link to Fix avatar heights") Sets avatar height to standard ###### IK targets size[​](#ik-targets-size "Direct link to IK targets size") Fixes discrepancies in avatar sizes and shapes #### Usage[​](#usage "Direct link to Usage") Avatar Multi Animation is set up the same as Avatar Effect, but, you will need to set the trigger to 4 under the component settings. Click on Add Component under the Inspector window, and search for Animate Multiple Avatars in the search bar. Enable the trigger in the Avatar Effect Script. Set the trigger radius to 4. Users can initiate a two person gesture inworld with a visible circle around them. The component has a few settings: * Clip A / Clip B Drag the animation takes from the fbx files for each of your two characters into these fields. Clip A will play on the initiator of the gesture. Clip B will play on the guest. * Distance Apart You can offset the characters here if you have not already defined the offset in via the root nodes of your models in your animation editing tool. * Fix Avatar Heights If your gesture involves both characters engaging in a very precise interaction, for instance shaking hands, you can align them using Fix Avatar Heights. Gestures played by tall and short avatars may not look correct otherwise. * Start Time You can delay the initiation of the animations. * IK Targets You can select one or more nodes on the avatars and impose an IK through the animation to correct for discrepancies in avatar sizes and shapes. You can get more informations and examples at [here](/sinespace-sdk/avatars/gestures.md). --- ### Browser Surfaces #### Overview[​](#overview "Direct link to Overview") Examples include using a music video URL for a club, and a training video streaming for business purposes. Examples include using a music video URL for a club, and a training video streaming for business purposes.
The browser surface script can only be used for streaming from URLs in the desktop client. ##### Browser Surface Script[​](#browser-surface-script "Direct link to Browser Surface Script") For making a media surface, first make the 3D object you want to use as a screen. In the inspector window, add the browser surface component to the item you are using for the screen. This will bring up the browser surface script in the inspector window. ![]() ##### Script Settings[​](#script-settings "Direct link to Script Settings") Width Use to set the width of the screen.
Height Use to set the height of the screen. Aspect ratios for width and height: * 1920x1080 * 1024x720 * 3840x2160 (4K)
Zoom This sets how far the zoom is on the screen.
URL Place the URL here for the video you want to stream.
Background Color This is the background color of the screen, which is defaulted to black. ##### YouTube Videos[​](#youtube-videos "Direct link to YouTube Videos") You can set YouTube videos to play in two different ways, depending on how you want them to be viewed. You will need to use specific URL addresses for these two different functions. ##### Default to Full-screen[​](#default-to-full-screen "Direct link to Default to Full-screen") You can choose to set the video to play defaulted at full screen. To do this, choose the YouTube video you want, and copy the video ID. The video ID is the last component of the URL. ![](/assets/images/videoid-0818a842ebf1e3bcb9c4726940a90737.jpg) Then, to make the video default to full-screen, you have to use this URL: , and replace the VIDEOID part with the actual video ID. ##### Autoplay[​](#autoplay "Direct link to Autoplay") You can choose to set the video to autoplay. To do this, first choose the YouTube video you want to stream,then set the autoplay button to autoplay then copy its' URL by righting clicking on the video. Copy this URL into the browser script URL space, and then add '?rel=0\&autoplay=1' at the end of the URL. ![](/assets/images/BrowserSurface2-47c409bc33cef4a421eb353d204a6a8f.png) ##### Screen Sharing[​](#screen-sharing "Direct link to Screen Sharing") The media surface works well with screen-sharing applications that stream to the browser. If you want to use screen sharing, you can use [join.me](https://www.join.me/) or [screenleap.com](http://www.screenleap.com/) to screen share. ##### Recommended Shader[​](#recommended-shader "Direct link to Recommended Shader") The recommended shader for the screen is a custom shader made by Sine Wave. [Download EmissiveScreen.shader](/assets/files/EmissiveScreen-447529c4b5fc84badc80a2d864d23745.shader) Download the file above and drag it into any folder in your Unity project. Create a new material in your project window by right-clicking and choosing Create>Material in the pop-up menu. When the new material is in your project window, click on it, and you will see its properties in the inspector window. On the shader drop-down menu, choose Sine Wave>Emissive Screen. For the best results, turn the smoothness and metallic sliders down to 0. ![](/assets/images/BrowserSurface3-d0e7479e1843196f4bb3e747354dfd69.png) ##### Viewing the Screen[​](#viewing-the-screen "Direct link to Viewing the Screen") When you use media surfaces, you are using them so you and other users can view the streaming content. You will need to set up a couple of things to make viewing the content easier. ##### Focus Camera Script[​](#focus-camera-script "Direct link to Focus Camera Script") The focus camera script is used to create a focus camera. This script needs a target to focus on, and this is where an empty object comes in. You will need to create a 3D object with a collider attached to it and add the focus camera component to it by choosing the object and clicking on Add Component in the inspector window. You need to place this 3D object close to your screen but not too close. Search for focus camera, and add it. Once it's added, you will see these settings in the focus camera script. ![]() Target Camera Position The target camera position is where you want the camera to focus on. Depth of Field If you check this, depth of field will be used. ##### Aligning the focus camera[​](#aligning-the-focus-camera "Direct link to Aligning the focus camera") To align the camera, first, you need to add a camera to your scene (delete the main camera and add a new one). To do this, right-click in the hierarchy and choose 'Camera'. Now you want to move and rotate this camera so the screen is shown fully in the preview window. The easiest way to move the camera is to use the transform tool and set the position to 0,0,0, then move it until you are satisified with the view. Here is an example: ![](/assets/images/Screencamera-4032f1f01032a00289b988011efcbd98.jpg) As you can see in the preview, the whole screen is in the camera's view. With the camera selected, in the inspector window, you will see the transform information. The transform information has a small settings button resembling a cog. Click on this, and it will open up a menu. ![](/assets/images/BrowserSurface4-67ab8511bfa302179cd11086072017e3.png) In the menu, choose 'Copy Component'. This will copy the transform values of the camera. Create an empty game object by right-clicking in the hierarchy and choose 'Create Empty'. Click on the empty game object in the hierarchy, and go to the transform information in the inspector window. As before, click on the cog, and in the menu, choose 'Paste Component Values'. This will paste the transform values of the camera to the empty game object. Doing this will ensure that the same view from the camera is now on the empty game object. ##### Choosing the focus camera position[​](#choosing-the-focus-camera-position "Direct link to Choosing the focus camera position") Now that the empty game object has the correct view of the screen, you will need to set that empty game object to be the focal point of the focus camera. To do this, click on the 3D object with the focus camera script attached. In the inspector window, you will see the focus camera script settings. Where it says 'Target Camera Position, drag the empty game object from your hierarchy into this box. It should look like this. ![]() You can choose whether or not to use depth of field. Choosing to turn on depth of field will blur the areas of the surface which the camera is not immediately focused on.
After you have finished with these settings, you can either add the surface into Space as a virtual good or use it in a region and upload the region. --- ### CatalogVendor #### Overview[​](#overview "Direct link to Overview") Fields Brand Name or your brand Tagline Tagline for your brand Brand Text Drop UI/3d text for your brand TagLineText Drop UI/3d tagline text for your brand Category Select a catego ![](/assets/images/400px-catalogvendor-b3baae39dd49688a03205eb89c7296ac.jpg) #### Fields[​](#fields "Direct link to Fields") ###### Brand[​](#brand "Direct link to Brand") Name or your brand ###### Tagline[​](#tagline "Direct link to Tagline") Tagline for your brand ###### Brand Text[​](#brand-text "Direct link to Brand Text") Drop UI/3d text for your brand ###### TagLineText[​](#taglinetext "Direct link to TagLineText") Drop UI/3d tagline text for your brand ###### Category[​](#category "Direct link to Category") Select a category to be displayed #### Usage[​](#usage "Direct link to Usage")
You can attach this component to an NPC or an object, in your region and it will open the Shopping window to your brand name and items can also be selected by category.
Brand Name Enter your brand name or brand name of the creator your wish to display. The shopping window will be filtered by this name. Tag line You can set a tagline of your brand here. Brand Text you can set a 3D or WorldUI brand name text by dropping the item here. TagLine text you can set a 3D or WorldUI Tagline text by dropping the item here. Category Select category you wish to display. If not category is select, all the items under your brand name will be shown.
--- ### ClickableActivator #### Overview[​](#overview "Direct link to Overview") This can be used to open/close doors, lights and all the things you need to activate with a click. This can be used to open/close doors, lights and all the things you need to activate with a click. ![](/assets/images/clickableactivator-4bbd54dca55dbba8858b6c10e60d93f7.jpg) Click the add sign then drag the item want to activate into the slot, then choose an action you need.
The Network options define whether the action will be synchronized with other users in the region. If you want to control an object which has already got a network ID(for example, defines in Room Floor component), you should use that ID and pick "Override Network ID" to avoid conflicts. Here is an example to create an object with Open/Close animations: ![](/assets/images/clickableactivator2-bbc3ca1ce1b807904d446d594171a5fe.jpg) The component supports play 2 animation like this, to realize a door open/close by clicking it. Note: you should untick the Loop Time checkbox for each animation or it will cause problems. --- ### Clickable Teleporter #### Overview[​](#overview "Direct link to Overview") This tutorial will show you how to turn an object into a clickable teleporter that you can use so visitors can transport to another region in SineSpace with the click of a button. This tutorial will show you how to turn an object into a clickable teleporter that you can use so visitors can transport to another region in SineSpace with the click of a button. #### Find and select an object to turn into a clickable teleporter[​](#find-and-select-an-object-to-turn-into-a-clickable-teleporter "Direct link to Find and select an object to turn into a clickable teleporter") First, in the Unity Editor you need to select an object to add the functionality to. This can either be an object in a scene, or an object that will be uploaded as furniture. The example shows a simple sign that has been created as furniture. #### Add the Scripting Runtime component[​](#add-the-scripting-runtime-component "Direct link to Add the Scripting Runtime component") After selecting the object, in the Inspector panel click on the Add Component button and start typing 'Scripting Runtime' - as you type, you will see search results and can click once you see it. #### Enter the script[​](#enter-the-script "Direct link to Enter the script") Copy and Paste in the code below into the Scripting Runtime component regionID = 15 coordinates = Vector.New(0,100,0) rotation = Quaternion.Euler(0,15,0) function activate() Space.Scene.PlayerAvatar.Teleport(regionID, coordinates, rotation) end After you've pasted in the text, replace the regionID in the top line with your destination's regionID. If the destination is your build, you can find the region ID on the [Curator site's Items page](https://curator.sine.space/items/list), on the listing for that region. If the destination is someone else's build, you will need to talk to the region owner to get their permission and the region ID *(as well as the coordinates below)*. The coordinates and rotation values *(lines 2 and 3 of the above script)* is where you want the avatar to arrive in your region. If you are not sure what to use, enter the transform coordinates from your region's main landmark. Once you've entered the coordinates, change the dropdown setting for Index to Legacy. #### Add the Clickable Activator component[​](#add-the-clickable-activator-component "Direct link to Add the Clickable Activator component") Now that the script is ready, you add a Clickable Activator to call it. Click the Add Component button and start typing 'clickable' and you should see it appear in the search results To configure the component, first you need to drag your GameObject from the scene hierarchy into the Object slot. Once you do that, you will be able to set the rest of the On Click Event () section up as pictured below. Enter whatever you like in the Tooltip section, this will display to users when they hover over your object in-world. #### Upload and test in-world[​](#upload-and-test-in-world "Direct link to Upload and test in-world") Finish and upload your region or furniture item and test it on the preview grid. The clickable object should highlight when you hover your pointer over it, and then clicking should transport you to your destination. --- ### Clothing Previewer #### Overview[​](#overview "Direct link to Overview") .png>) Fields Player Outfit ID Here you can add one of your saved outfits by copying the outfit ID from the viewer outfit window. ![]() #### Fields[​](#fields "Direct link to Fields") ###### Player Outfit ID[​](#player-outfit-id "Direct link to Player Outfit ID") Here you can add one of your saved outfits by copying the outfit ID from the viewer outfit window. ###### Detail Level[​](#detail-level "Direct link to Detail Level") The detail level of the preview. ###### Clothing Item[​](#clothing-item "Direct link to Clothing Item") The clothing item you want to preview. Pattern The clothing pattern you want to preview. info When using patterns, make sure to also include the original item in the β€œClothing Item” slot.
--- ### Collider Trigger Activator #### Overview[​](#overview "Direct link to Overview") Fields Triggers Owner Only If checked this script will ignore owner. ![](https://lh7-us.googleusercontent.com/XRx4sszxJ12ZW7DLBwMOkWwcinEOa8tApmjf2-GPjOiBugYWICBQ7Cd_tatUlIeJ4c3eNfoN1SDQiZ5a3OkXb_BaBDgmYbI8psLqlJVcw0wS1zgHENyOIuHX1oGVg5ImZ09Ifu-gvW1fDa81b4ncfFw) #### Fields[​](#fields "Direct link to Fields") ##### Triggers[​](#triggers "Direct link to Triggers") ###### Owner Only[​](#owner-only "Direct link to Owner Only") If checked this script will ignore owner. i.e not will happen if owner is within the range. ###### Exclude owner[​](#exclude-owner "Direct link to Exclude owner") if checked the effect will only trigger on client side. i.e triggered effect won't be shown to all avatars present in the regions. (better performance in certain cases.) ##### Events[​](#events "Direct link to Events") Events Activate Click the add sign then drag the item to be activated when avatar is within the range here. Then select what function should be activated. Eg: Particle system function select start. You can click on add to add multiple items and select function for each Events Deactivate Click the add sign then drag the item to be deactivated when avatar is out of the range here. Then select what function should be activated. Eg: Particle system function select start. You can click on add to add multiple items and select function for each. #### Usage[​](#usage "Direct link to Usage") This can be used to open/Close doors. Activate deactivate particle effects. Auto light the interior of a house etc. --- ### Components by Function #### Overview[​](#overview "Direct link to Overview") This page lists particularly common functionalities, and describes the best tool for the job with a focus on commonly used terms in other popular virtual worlds. This page lists particularly common functionalities, and describes the best tool for the job with a focus on commonly used terms in other popular virtual worlds. ##### Animate Anything[​](#animate-anything "Direct link to Animate Anything") * Use Mecanim, you can animate *anything* - objects, materials/textures, texture scrolling, skinned animation (including mocap imports). Can be used on any object (Clothing, Gestures, Regions, Vehicles, etc.) See [Unity Documentation](https://docs.unity3d.com/Manual/AnimationOverview.html) ##### Doors[​](#doors "Direct link to Doors") * Use Mecanim (see above) and one of: * [Components/ProximityActivator](/sinespace-sdk/components/proximity-activator.md) * [Components/ClickableActivator](/sinespace-sdk/components/clickable-activator.md) * World Space UI Canvas (Unity Feature) -- use to make buttons. ##### Seat / Poseball[​](#seat--poseball "Direct link to Seat / Poseball") * [Components/SeatImproved](/sinespace-sdk/furniture/seatimproved.md) ##### Tip Jars[​](#tip-jars "Direct link to Tip Jars") * Check [Tip Jar](/sinespace-sdk/components/tip-jars.md) for details. ##### NPC[​](#npc "Direct link to NPC") See: * [Components/Statue](/sinespace-sdk/components/statue.md) - base NPC component * [Components/WanderingNPC](/sinespace-sdk/components/wandering-npc.md) * [Components/QuestNPC](/sinespace-sdk/components/quest-npc.md) * [Components/QuestDesigner](/sinespace-sdk/quests/questdesigner.md) ##### Audio[​](#audio "Direct link to Audio") Music, see: * [Components/StreamingBackgroundMusic](/sinespace-sdk/components/streaming-background-music.md) - for linked MP3/OGG files. * [Components/SceneBackgroundMusic](/sinespace-sdk/components/scene-background-music.md) - for Shoutcast/streaming music. SFX and Environmental Audio: * See Unity Manual, all parts work (including Reverb Zones and other audio filters and effects like low/high-pass, distortion, echo, etc.) [Audio Sources](https://docs.unity3d.com/Manual/class-AudioSource.html) ##### Particles[​](#particles "Direct link to Particles") * Use Shuriken, the [Unity3d Particle System](https://docs.unity3d.com/Manual/ParticleSystems.html) ##### Vendor / Merchant[​](#vendor--merchant "Direct link to Vendor / Merchant") See: * [Components/InventoryVendor](/curator-dashboard/items/inventoryvendor.md) * [Components/CatalogVendor](/sinespace-sdk/components/catalog-vendor.md) ##### Teleports[​](#teleports "Direct link to Teleports") See: * [Components/TeleportPad](/sinespace-sdk/components/teleport-pad.md) - intraregion teleports with UI * [Components/TeleportLocal](/sinespace-sdk/components/teleport-local.md) - intraregion teleports * [Components/TeleportWorld](/sinespace-sdk/components/teleport-world.md) - interregion teleports ##### Vehicles[​](#vehicles "Direct link to Vehicles") See: * [Vehicles](/sinespace-sdk/vehicles.md) ##### Clothing Customisation[​](#clothing-customisation "Direct link to Clothing Customisation") ##### HUDs[​](#huds "Direct link to HUDs") * Use a UI Canvas (Unity, see [documentation](https://docs.unity3d.com/Manual/UICanvas.html)). Screen Space or World Space, can be embedded in regions. * You *probably* don't need these. ##### Gatcha / Lucky Dip[​](#gatcha--lucky-dip "Direct link to Gatcha / Lucky Dip") See: --- ### Customize Components #### Overview[​](#overview "Direct link to Overview") If you want to create your own special game in Sinespace, you may find that it’s very important to know how to customize the components -- instead of throwing all things to lua scr If you want to create your own special game in Sinespace, you may find that it’s very important to know how to customize the components -- instead of throwing all things to lua script, using the components we offered in the Editor pack with a clear logic should be the best way for creation. Basically, we could let you do the same thing as you can do in Unity vanilla(which means the pure original version of Unity, doesn’t include 3rd party plug-ins), but we still haven’t package all the things into our SDK. So, if you find something can easily done in Unity, but feel hard to realize it in Sinespace, don’t hesitate to contact the staff. Here I will show some easy examples for you to create different types of game. ##### A collider-based checkpoint in racing game[​](#a-collider-based-checkpoint-in-racing-game "Direct link to A collider-based checkpoint in racing game") *Note: This is one component like I said above. It uses a component called Trigger Activator -- originally it only functions with Avatars, when you drive a car in Sinespace and pass a collider with Trigger Activator, it won’t be activated. In future version(test/release build from 2019 Feb), this Trigger Activator will also affected by vehicles, so you can use this component and a isTrigger Box collider to simply create a checkpoint/start-finish line(but of course you may still need lua script if you want to put a counter or some other function which is not directly supported by unity in it).* ![TriggerActivator.png](/assets/images/triggeractivator-cf1f5301cb3bcb7301fc40bde35da059.png) For example, in this scene, we have a thin box collider between two cylinder here, works as a checkpoint. When the vehicle pass it, it will play the particle effect(no loop), raise the counter by 1, and refresh a text of the counter indicator on the UI layer. *Because of unknown reason, it is suggested that not have any other collider contact with this box collider, otherwise the event will be triggered once when the region is loaded. Or you can check the Exclude Owner option to avoid this happen(but it will also cause your avatar won’t be able to trigger the event anymore, which may be annoying when doing the tests).* Using the component β€œScripting Runtime” to add lua script to game objects. Don’t worry if you are not familiar with writing codes -- to create a game, the logic is more important than the technique of programming. It is more important that before doing the work, make yourself be clear about what function you need, and a simple way to realize it. In this example, we can use a simple flow-process diagram to show what we want to do: ![CheckpointFlowProcess.png](/assets/images/checkpointflowprocess-13a48da5e59394c3b679a2eda1cfec5d.png) So from this diagram, you may find out what you need to prepare for realizing these. Let's do them one by one. First, create a Text object, and change its name to something unique, i.e. here it's "checkpointindicator". Add Scripting Runtime to it, and add the code below: ```lua Space.Shared.SetGlobal("racingComponent", "ctr", 0); counter = Space.Shared.GetGlobal("racingComponent", "ctr"); local obj = Space.Host.ExecutingObject; obj.UIText.text = "Counter:" .. counter; function RefreshText() counter = Space.Shared.GetGlobal("racingComponent", "ctr"); obj.UIText.text = "Counter:" .. counter; end ``` It declare a global variable and initialize it with 0 using SetGlobal, which can be used in other script by using GetGlobal. Then find the Text component attached to itself. The function RefreshText is the function refresh the text when the counter's value changes. It will only be effected when called. For example, when can call it when the vehicle exit the collider of checkpoint: ![TriggerActivator2.png](/assets/images/triggeractivator2-b75f6bba994b60e0e304bc3d4e69333d.png) The code for the checkpoint is like below: ```lua local obj = Space.Host.ExecutingObject; local particle = obj.ParticleSystem; local txt = Space.Scene.Find("Notify"); function AddCounter() counter = Space.Shared.GetGlobal("racingComponent", "ctr"); if(counter == 0) then counter = counter + 1; Space.Shared.SetGlobal("racingComponent", "ctr", counter); particle.Play(); txt.UIText.text = ""; Space.Log("counter:" .. counter); else txt.UIText.text = "Checkpoint Missed"; end end ``` Notify is another Text gameobject for showing the message of missing checkpoint. To find other object in the scene, use function Space.Scene.Find(object name) is one method, that's why set a unique name to game object is needed. When a checkpoint is ready, you can duplicate them, and don't forget to modify the line "if(counter == 0)", where the 0 should be n-1 where the n is the order of the checkpoint. And for finish line: ```lua local obj = Space.Host.ExecutingObject; local particle = obj.ParticleSystem; local txt = Space.Scene.Find("Notify"); local txt2 = Space.Scene.Find("CheckpointIndicator"); function Reset() counter = Space.Shared.GetGlobal("racingComponent", "ctr"); if(counter == 3) then particle.Play(); txt.UIText.text = ""; txt2.UIText.text = "Finished!"; counter = 0; Space.Shared.SetGlobal("racingComponent", "ctr", counter); else txt.UIText.text = "Checkpoint Missed"; end end ``` I put 3 checkpoints in total, so here the check condition is counter == 3. You can also add a lap counter in this finish line so it can use for multiple laps race. The function Reset will be called when the vehicle reach the finish line. --- ### Day/night cycle #### Overview[​](#overview "Direct link to Overview") First you will need a directional light to which to attach the script component. First you will need a directional light to which to attach the script component. A directional light was included when you created a new scene. If one isn't in the hierarchy panel (maybe you deleted it), you'll need to add one. Go to the menus at the top of the editor window and click Game Object - Light - Directional Light. You'll need to add the Day Night Circle component (script) to your directional light. You can create a new empty object to attach with this component. *** ![]() *** ###### Component Settings[​](#component-settings "Direct link to Component Settings") #### **Preview**[​](#preview "Direct link to preview") Preview is where you can toggle on and off 'Preview Enabled' to be able to see the lighting for different times of day in your Unity scene. You can drag the Preview Time of Day along to see what different times of day look like. The slider is set to 0 to begin with, this is midnight. 0.5 is midday. You should disable the preview before uploading the region. #### **Clock Set-up**[​](#clock-set-up "Direct link to clock-set-up") By default, the light will be particularly harsh, the cycle will be set to 1440 minutes (a full 24 hr day), and start from mid night. You can modify the duration as you wish. Toggle the "Use local System Clock" on will use your local timestamp instead of using server time. If you pick "Use Fixed", the time will be locked, you can set the time you want fixed by modify the slider bar of "Fixed Time of Day", the value is from 0 to 1, corresponding the color bar of sun. #### **Sun Light**[​](#sun-light "Direct link to sun-light") Next drag the "Sun light" object into the Sun Light slot. If you create the region by using quick start, then it's the object called "Directional Light" that controls the sun light. You can find the Quick-start region by going to Assets>Sample Art>Quickstart in the Project window. | | | -------------------------------- | | *Fig. 2: How to find quickstart* | ![](/assets/images/700px-quickstartregion-3be5af038adb14714ff070339a5ac49f.png) | | | ------------------------------------ | | *Fig. 3: Directional Light Settings* | ![]()
If white light is too harsh for you, you can change the color of this by changing the 'Sun Light' color on the Day /Night cycle component, not on the directional light. You will need to change the 'Flare' setting on the Directional Light so that the flare is set to Sun. You can do this by clicking on the circle next to the Flare box, and choose Sun. ##### **Environmental Cubemaps**[​](#environmental-cubemaps "Direct link to environmental-cubemaps") This is to update the reflection probes in the region. The 'Update Cubemap Frequency' number is in seconds, so if you want to update the cubemap frequency every 30 seconds, leave it as it is. This basically changes the amount of light reflection on objects in the region, e.g. at night time you don't want reflective surfaces to reflect too much light. ##### **Sun Light**[​](#sun-light-1 "Direct link to sun-light-1") This is where you drag in the directional light for the 'Sun'. You can set the color of the sunlight here, and also set the Sun Offset Rotation and Sun Rotation Axis. The Sun Offset Rotation and Sun Rotation Axis control the value of the movement of the sun during the day time. If you don't need a custom trail of movement for the sun, just leave it as default. ##### **Sun Shafts**[​](#sun-shafts "Direct link to sun-shafts") The Sun Shafts image effect simulates the radial light scattering (also known as the β€œgod ray” effect) that arises when a very bright light source is partly obscured. Here you can change the colors of the sun shafts. You can check the 'Update Sun Shafts' to keep the sun shafts updated when objects are placed in the region. ##### **Ambient Light**[​](#ambient-light "Direct link to ambient-light") This will change the ambient light in the region. You can change the sky color, Equator color (This is the horizon area) and ground color. ##### **Fog**[​](#fog "Direct link to fog") You can change the colors for fog here and change the fog minimum curve and maximum curve. The fog curves set the minimum distance and maximum distance of fog, which in turn changes the amount of fog at certain times of day. You can click on the fog bar to change the curve between the values of 0 and 1. ##### **Water Set-up**[​](#water-set-up "Direct link to water-set-up") If you have water-like things in your scene, you can attach its material to the water material slot, which can make the light affect to the water too. You can change the colors for the water here if you wish. ##### **Events**[​](#events "Direct link to events") You can add events like playing music and animations. The events trigger is set to Dawn, Midday, Dusk, and Midnight. You can set this up to notify specific animators as well. ##### **Shader Parameters**[​](#shader-parameters "Direct link to shader-parameters") Toggling the 'Use local System Clock' and 'Shader send time of day' together will align your day/night cycle with your real-world local time. The Shader Send Color option will send the colors under the shader bar to the Lighting, meaning the lighting will change to these colors at certain times of day. --- ### EdyCompatibleVehicle #### Overview[​](#overview "Direct link to Overview") This component allows you to turn a vehicle designed using \[Edy's Vehicle Physics] in Space. This component allows you to turn a vehicle designed using \[Edy's Vehicle Physics] in Space. It must be attached to the same object that contains 'Car Control', 'Car Settings' and 'Car Cameras', if any of these components are missing, it will not function. Note: This component has not been tested in a while; it may have bugs. Please report them if you find them. --- ### Enemy NPCs and NPC spawners #### Overview[​](#overview "Direct link to Overview") FPS Components Shooter games FPS The safe zone lobby Guns and gun givers Health and ammo givers Traps King of the hill zone Player spawn points The NPC Spawners spawn NPCs that will then attack players. ###### FPS Components[​](#fps-components "Direct link to FPS Components") [Shooter games FPS](/sinespace-sdk/games/shooter-games-fps.md) [The safe zone lobby](/sinespace-sdk/games/the-safe-zone-lobby.md) [Guns and gun givers](/sinespace-sdk/games/guns-and-gun-givers.md) [Health and ammo givers](/sinespace-sdk/games/health-and-ammo-givers.md) [Traps](/sinespace-sdk/games/traps.md) [King of the hill zone](/sinespace-sdk/games/king-of-the-hill-zone.md) [Player spawn points](/sinespace-sdk/games/player-spawn-points.md) The NPC Spawners spawn NPCs that will then attack players. Standard NPCs currently attack with melee actions. (Ranged NPCs are in development.) Enemy NPCs have configurable settings for range, attack rate and damage, and for damage, attack, death and victory events. NPC Spawners are placeable inventory items that players can deploy in their maps and which will spawn NPCs according to their settings. Individual NPC spawners can spawn multiple NPC types. Public variables on the NPC spawner allow players to customise settings including spawn rate and lifetime of NPCs. This video tutorial shows how to configure and publish your own Enemy NPCs and NPC Spawners as inventory items that players can in place in their multi-player maps in Sinespace; [Watch on YouTube](https://youtube.com/watch?v=V2-5ATy5kTs) ##### NPCS[​](#npcs "Direct link to NPCS") 1. Public Variables There are 15 public variables on the NPC. 1. attackModes This number should parallel the number set up in the NPC’s Animation Controller. In the default Animation Controller there are four unique attack moves, two damage moves, one kill celebration and one death move. You can alter these but remember to define that in the parameters here. Animations are selected randomly. 1. attackRange Attack range is the distance from the player at which the NPC will begin it’s attack animation. To get a good experience you want to align three different distances; the **attackRange**, the **meleeRange** (below) and the radius of the collider on the NPC. The collider hitting the player is the actual damage event. The **meleeRange**, also a public variable on the NPC script, defines the closest the NPC will get to the player; if it gets too close then the player’s gun will stick out behind the NPC and the player will not be able to shoot the NPC. The NPC may be partially off camera and it’s attack animations will probably look wrong. For a regular biped you might set **attackRange** to 2 meters, set the radius of the collider to 1.5 and set the **meleeRange** to 1 meter. 1. deathModes deathModes, like the attackModes, defines the number of death sequences the NPC will randomly select from. Double click on the dying node in the first layer of the Animation Controller and you can see the four options the default art pack offers. 1. damageModes damageModes are also randomly selected, as animations playing when the NPC takes damage. 1. meleeRange meleeRange is the closest the NPC will get to the player before stopping moving toward the player. 1. intervalNoTarget intervalNoTarget defines how often the NPC will scan the scene looking for players during it’s idle cycles. It defaults to 5 seconds which to be honest makes for some pretty sleepy NPCs. You might set yours to 1 second. Much lower than that could impact performance in a scene full of NPCs. 1. intervalTarget intervalTarget defines how often the NPC scans for players when it is actively hunting and attacking a player; the default is .25 seconds which should be sufficient for any NPC. 1. viewDistance viewDistance defines how far the NPC can see. The NPC cannot see behind itself. It will attack if a player shoots it but does not (yet!) attack if it sees a bullet go by. 1. viewHeight viewHeight is the height the NPC scans for players at. If you are working with our standard character player avatar system or any regular biped costume avatars you shouldn’t need to adjust this. 1. attackSpeed attackSpeed defines how fast the NPC moves when hunting and attacking the player. 1. wanderSpeed wanderSpeed defines the NPC’s idle movement speed. 1. collisionDamageValue collisionDamageValue defines how much damage the NPC does each time it strikes. 1. collisionInterval collisionInterval defines how often the NPC inflicts damage when the player is within the NPC’s collider. 1. repeatDamage repeatDamage is a toggle, 0 or 1. Leave it on 1 for any regular attacking NPC. If you are creating some kind of bomb or other single attack event set repeatDamage to 0 to go off only once when triggered. 1. startHealth startHealth defines the amount of health the NPC has when it spawns. 1. Events There are 9 available events on the NPC. * Spawn * Hide * Die The Spawn, Hide and Die events are configured with specific triggers that the game depends on. Please don’t change these settings. * Discover * Attack * Attackend * Losttarget * Damage * Kill The other six are available for triggering various events at your discretion. 1. Object references There are three object references; * HealthValue\*\* and **HealthWrapper** reference the world space canvas on the NPC that is hovering over its head. You can change the font and size of these if you want to bring them in line with the rest of your game UI. The **animator** references the AO for the NPC. The **Trigger activator** triggers damage from the capsule collider. Again note it needs to be set to owner only. The **navmesh agent and character controller** are both standard Unity components. Both are required for the NPC to function. The default settings should be fine for a regular biped. Please note the navmesh agent should be left disabled in your project. ##### NPC spawner[​](#npc-spawner "Direct link to NPC spawner") The NPC Spawner is a spawnable furniture item that players can place in their maps to spawn enemt NPCs that will attack players. 1. Public variables There are seven public variables. 1. npcTypes npcTypes defines the number of different NPCs that the spawner will emit. Each NPC type needs to be referenced in the **Resources** below. If you upload a spawner that spawns 3 enemy types and you let the player change the number, going over 3 wont’ do anything. Coming down to 2 or 1 will cut back on a numbered basis; e.g. if the player sets this to 1 inworld then only the npc1 in the **Resources** will spawn. 1. npcPoolSize npcPoolSize defines the number of NPCs that will be created and set inactive, per type, per spawner in the scene. Running a pool of NPCs improves performance compared to destroying and creating NPCs individually. To calculate the appropriate pool size you need to consider three factors; * Lifetime of NPC * Spawn rate * Types For example, if the lifetime of an NPC is 60 seconds and the spawn rate is three seconds you can only ever have two in the scene at once from that spawn point. So the pool required is 2 max. If you have multiple different types the pool actually comes down because it will pool for every type and it will cycle through types in order not randomly. To cross check your pool size use this calculation; Lifetime / spawn interval / type, then round up. * npcSpawnMinRange and npcSpawnMaxRange\*\* define the radius from the Spawner where the NPCs will appear. You might want them to spawn from one single spawner across the whole map randomly or you might want to lock it down so they visually appear in the middle of a visible portal. * npcLifetime\*\* defines the lifetime of individual NPCs, which will die on their own when their lifetime expires. You might want to set this to be higher than the default 60 seconds. If you set it too high you will risk exceeding your pool and further NPCs may not spawn until the available ones are killed. If you dramatically increase both the pool and the npcLifetime you might hit some performance issues. If you are developing a map or a game that is more like a coop campaign than an arena then you might set your npcLifetime very high and the spawn rate (the delay between spawing) very high too. You can also put a trigger on the spawner itself that switches it off completely once the first generation of NPCs are spawned. * npcSpawnHeight\*\* lifts the biped above the ground when it spawns to ensure it does not spawn fractionally below the terrain. 1. Resources Add all your NPC types to the **resources** slots available. The name of the prefab doesn’t matter but the naming convention on the resources does and it should be npc1 npc2 etc. all lower case. 1. Events There is one **event** available which is the spawn event. You can add a particle effect or anything else you want to coincide with the enemy being spawned. --- ### FocusCamera #### Overview[​](#overview "Direct link to Overview") Fields Target Camera Position Drag the target Camera here Use Depth of field Enables depth of Field on camera Usage When combined with other components, it can be used as switching ![](data:image/jpeg;base64,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) #### Fields[​](#fields "Direct link to Fields") ###### Target Camera Position[​](#target-camera-position "Direct link to Target Camera Position") Drag the target Camera here ###### Use Depth of field[​](#use-depth-of-field "Direct link to Use Depth of field") Enables depth of Field on camera #### Usage[​](#usage "Direct link to Usage") When combined with other components, it can be used as switching the view from your avatar to this extra camera by a clickable activator. You can check [here](https://app.gitbook.com/o/-M1WuIvOi8-UsP7Qc00_/s/-MAUay5St6OsKydrbQTw/~/changes/101/sinespace-sdk/components/browser-surfaces#focus-camera-script) for an example of utilisation. --- ### FollowAvatar #### Overview[​](#overview "Direct link to Overview") Fields Offset Position Offset (World Coords) Usage Once an object with this component is active in a region, each user in the region will have this object following him, but it doesn't show to other clients. ![](data:image/jpeg;base64,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) #### Fields[​](#fields "Direct link to Fields") ###### Offset[​](#offset "Direct link to Offset") Position Offset (World Coords) #### Usage[​](#usage "Direct link to Usage") Once an object with this component is active in a region, each user in the region will have this object following him, but it doesn't show to other clients. The position can be offset with a world-space offset specified compared to the player's Avatar in the Offset field. info *this component is easy to create some visual effect which only shows to the player. This is not the one for creating following pets/minions.* --- ### General #### Overview[​](#overview "Direct link to Overview") This page lists every Sinespace SDK component, grouped by function. #### Common & creator[​](#common--creator "Direct link to Common & creator") * [Components by Function](/sinespace-sdk/components/components-by-function.md) * [Customize Components](/sinespace-sdk/components/customize-components.md) * [Virtual Goods](/sinespace-sdk/components/virtual-goods.md) #### Avatar effects & gestures[​](#avatar-effects--gestures "Direct link to Avatar effects & gestures") * [Avatar Animation Effect](/sinespace-sdk/components/avatar-animation-effect.md) * [Avatar Audio Effect](/sinespace-sdk/components/avatar-audio-effect.md) * [Avatar Effect](/sinespace-sdk/components/avatar-effect.md) * [Avatar Effect Camera](/sinespace-sdk/components/avatar-effect-camera.md) * [Avatar Effect Camera Movement](/sinespace-sdk/components/avatar-effect-camera-movement.md) * [Avatar Effect LUT](/sinespace-sdk/components/avatar-effect-lut.md) * [Avatar Effect Object](/sinespace-sdk/components/avatar-effect-object.md) * [Avatar Effect Snapshot](/sinespace-sdk/components/avatar-effect-snapshot.md) * [Avatar Multi Animation Effect](/sinespace-sdk/components/avatar-multi-animation-effect.md) * [Clothing Previewer](/sinespace-sdk/components/clothing-previewer.md) * [Follow Avatar](/sinespace-sdk/components/follow-avatar.md) #### Vehicles[​](#vehicles "Direct link to Vehicles") * [Edy Compatible Vehicle](/sinespace-sdk/components/edy-compatible-vehicle.md) * [Modular Buoyancy](/sinespace-sdk/components/modular-buoyancy.md) * [Sail Strip](/sinespace-sdk/components/sail-strip.md) * [Slider Vehicle](/sinespace-sdk/components/slider-vehicle.md) * [Speedometer](/sinespace-sdk/components/speedometer.md) * [Vehicle Physical Animator](/sinespace-sdk/components/vehicle-physical-animator.md) * [Vehicle Respawn](/sinespace-sdk/components/vehicle-respawn.md) #### Teleporting[​](#teleporting "Direct link to Teleporting") * [Clickable Teleporter](/sinespace-sdk/components/clickable-teleporter.md) * [Teleport Local](/sinespace-sdk/components/teleport-local.md) * [Teleport Pad](/sinespace-sdk/components/teleport-pad.md) * [Teleport World](/sinespace-sdk/components/teleport-world.md) #### Quests[​](#quests "Direct link to Quests") * [Quest Counter Clickable](/sinespace-sdk/components/quest-counter-clickable.md) * [Quest Counter Proximity](/sinespace-sdk/components/quest-counter-proximity.md) * [Quest Game Object](/sinespace-sdk/components/quest-game-object.md) * [Quest NPC](/sinespace-sdk/components/quest-npc.md) * [Startable Clothing Requirement](/sinespace-sdk/components/startable-clothing-requirement.md) * [Startable Gesture Requirement](/sinespace-sdk/components/startable-gesture-requirement.md) * [Startable Item Requirement](/sinespace-sdk/components/startable-item-requirement.md) * [Startable Room Visit](/sinespace-sdk/components/startable-room-visit.md) * [Startable Sit Requirement](/sinespace-sdk/components/startable-sit-requirement.md) * [Startable Snapshot](/sinespace-sdk/components/startable-snapshot.md) * [Startable Teleport](/sinespace-sdk/components/startable-teleport.md) * [Startable Timed Counter](/sinespace-sdk/components/startable-timed-counter.md) #### NPCs[​](#npcs "Direct link to NPCs") * [Enemy NPCs and NPC Spawners](/sinespace-sdk/components/enemy-npcs-and-npc-spawners.md) * [NPC Crowd](/sinespace-sdk/components/npc-crowd.md) * [NPCs](/sinespace-sdk/components/npcs.md) * [Statue](/sinespace-sdk/components/statue.md) * [Upgrade Account NPC](/sinespace-sdk/components/upgrade-account-npc.md) * [Wandering NPC](/sinespace-sdk/components/wandering-npc.md) #### Merchant & vendors[​](#merchant--vendors "Direct link to Merchant & vendors") * [Animated Vendor Console](/sinespace-sdk/components/animated-vendor-console.md) * [Animation Vendor](/sinespace-sdk/components/animation-vendor.md) * [ATM](/sinespace-sdk/components/atm.md) * [Catalog Vendor](/sinespace-sdk/components/catalog-vendor.md) * [Modular Vendors](/sinespace-sdk/components/modular-vendors.md) * [Tip Jars](/sinespace-sdk/components/tip-jars.md) * [Vendors for Your Business Region](/sinespace-sdk/components/vendors-for-your-business-region.md) #### Zones & environment[​](#zones--environment "Direct link to Zones & environment") * [Audio Reactive](/sinespace-sdk/components/audio-reactive.md) * [Day-Night Cycle](/sinespace-sdk/components/day-night-cycle.md) * [Gravity Zone](/sinespace-sdk/components/gravity-zone.md) * [Lens Flare Distance](/sinespace-sdk/components/lens-flare-distance.md) * [Meta Balls](/sinespace-sdk/components/meta-balls.md) * [Music Zone](/sinespace-sdk/components/music-zone.md) * [Scene Background Music](/sinespace-sdk/components/scene-background-music.md) * [Streaming Background Music](/sinespace-sdk/components/streaming-background-music.md) * [Substitute Animation Zone](/sinespace-sdk/components/substitute-animation-zone.md) * [Voice Zone](/sinespace-sdk/components/voice-zone.md) * [Volumetric Light](/sinespace-sdk/components/volumetric-light.md) #### Activators & triggers[​](#activators--triggers "Direct link to Activators & triggers") * [Clickable Activator](/sinespace-sdk/components/clickable-activator.md) * [Collider Trigger Activator](/sinespace-sdk/components/collider-trigger-activator.md) * [Proximity Activator](/sinespace-sdk/components/proximity-activator.md) #### Other components[​](#other-components "Direct link to Other components") * [Browser Surfaces](/sinespace-sdk/components/browser-surfaces.md) * [Focus Camera](/sinespace-sdk/components/focus-camera.md) * [Mailbox](/sinespace-sdk/components/mailbox.md) * [Move Object](/sinespace-sdk/components/move-object.md) * [Pool](/sinespace-sdk/components/pool.md) * [Simple Networking](/sinespace-sdk/components/simple-networking.md) * [Simple State Machine](/sinespace-sdk/components/simple-state-machine.md) * [Synced Physics Doodad](/sinespace-sdk/components/synced-physics-doodad.md) * [Timer](/sinespace-sdk/components/timer.md) * [VIP Collider](/sinespace-sdk/components/vip-collider.md) --- ### GravityZone #### Overview[​](#overview "Direct link to Overview") Fields Priority Sets the priority Local Gravity Set the gravity values for x,y,z axis Usage Create an empty object add GravityZone component. ![](/assets/images/500px-gravityzone-da75724f52b25df15b11f83f97ef31e4.jpg) #### Fields[​](#fields "Direct link to Fields") ###### Priority[​](#priority "Direct link to Priority") Sets the priority ###### Local Gravity[​](#local-gravity "Direct link to Local Gravity") Set the gravity values for x,y,z axis #### Usage[​](#usage "Direct link to Usage") Create an empty object add GravityZone component. Add a Box collider with isTrigger checked, edit the constrains of the box collider to set the area size. Priority Sets the priority of the gravityzone local Gravity Sets the local gravity for x,y,z axis. As an example, the default gravity could be Priority = 10, and the axis is (0,-1,0). If you want to make an environment like moon, set the Priority < 10, otherwise Priority > 10. (0,-1,0) means the direction of Gravity is downward. You can also set to another direction as your wish. --- ### LensFlareDistance #### Overview[​](#overview "Direct link to Overview") Fields Min Distance Sets min distance for lens flare. ![](data:image/jpeg;base64,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) #### Fields[​](#fields "Direct link to Fields") ###### Min Distance[​](#min-distance "Direct link to Min Distance") Sets min distance for lens flare. ###### Max Distance[​](#max-distance "Direct link to Max Distance") Sets max distance for lens flare. --- ### Mailbox #### Overview[​](#overview "Direct link to Overview") Fields Mail Animation to play Open Mail On-Click Sound Mail Arrive On-Mail Arrive Sound This is used to create Mail boxes within the scene; specifically objects which when clicked on will open the players Mail window. ![](/assets/images/400px-mailboxcomponent-c377ade155a3faa592385efcb654c56e.jpg) #### Fields[​](#fields "Direct link to Fields") ###### Mail[​](#mail "Direct link to Mail") Animation to play ###### Open Mail[​](#open-mail "Direct link to Open Mail") On-Click Sound ###### Mail Arrive[​](#mail-arrive "Direct link to Mail Arrive") On-Mail Arrive Sound This is used to create Mail boxes within the scene; specifically objects which when clicked on will open the players Mail window. It will play an animation when new mail has been received, or the player walks into range and has unread mail. This uses the Legacy Animation Component in Unity3D for it's animations (this likely will be updated to Mecanim soon). info This component is itself a legacy component (and may be depreciated and removed in the future), or is likely to get an update in the future. --- ### Meta Balls #### Overview[​](#overview "Direct link to Overview") Fields IsoLevel is a threshold value that determines the strength of the field that defines the metaballs. ![](https://lh4.googleusercontent.com/KyrNp7AKazs0pTpA9ws5O0Y9y8FFXUfoclj-mPvQlpW0syL8xdbFbeLXetLwUmtOJ-Me0Hvni0VvB2l0zLKyMB-9etE_kXzOvBTgKjd4SDrDnMZnqWprMpsnG4evACtbhlh6gLnHu0SkC9MrGCTq8oo)
![](https://lh5.googleusercontent.com/LCBCjmAb8fPPFJMAzSqQJY2FcsRCHIs6C3Tp9UFPTsSEKaVpfvI3NDVx690T6hVPSGQo8aEFngrM2ZrUHtxJs7yzbnISINFzN8dU7v6C4VQfdaoW7Me67WMg0WU7_j0uRqEuUBCTnahYiblpXAjWtcQ) #### Fields[​](#fields "Direct link to Fields") ###### IsoLevel[​](#isolevel "Direct link to IsoLevel") is a threshold value that determines the strength of the field that defines the metaballs. ###### Random Seed[​](#random-seed "Direct link to Random Seed") for metaballs refers to a value that is used to generate random noise that is added to the field that defines the metaballs. ###### Debug Max Tri[​](#debug-max-tri "Direct link to Debug Max Tri") when the scene is running, this will show the number of triangles the metaball is using. ####
Usage[​](#usage "Direct link to usage") Create an empty game object and attach a mesh filter and mesh renderer component. Then search the project for metaball and drag the metaball script from the project to the game object.
( normal add and search does not work with this component) --- ### Modular Buoyancy #### Overview[​](#overview "Direct link to Overview") .png>) Fields Density represents the density of the object that is being simulated, which is used to calculate the volume and mass of the object. ![]() #### Fields[​](#fields "Direct link to Fields") ###### Density[​](#density "Direct link to Density") represents the density of the object that is being simulated, which is used to calculate the volume and mass of the object. This parameter is important for the buoyancy simulation because it determines how much the object will displace the water around it. ###### SlicesPerAxis[​](#slicesperaxis "Direct link to SlicesPerAxis") represents the number of slices that the object will be divided into along each of its three axes to create a grid of voxels. This grid is used to simulate the buoyancy of the object by calculating the displacement of the voxels in response to the physics simulation. A higher number of slices will result in a more detailed and accurate simulation, but it will also require more computational resources to run. ###### IsConcave[​](#isconcave "Direct link to IsConcave") (mesh colliders only) determines whether or not the generated voxels will be allowed to create concave shapes. Concave shapes can complicate the buoyancy simulation and may require more computational resources to simulate accurately. If IsConcave is set to true, the buoyancy simulation will be more accurate but may be slower to compute. ###### VoxelsLimit[​](#voxelslimit "Direct link to VoxelsLimit") sets a maximum for the number of voxels used in buoyancy simulation. If the number of voxels in the object exceeds this limit, the script will stop generating additional voxels and will instead use the existing voxels to simulate buoyancy. This is done to prevent the simulation from becoming too computationally expensive and to ensure that it runs smoothly in real-time. In general, adjusting these parameters requires a trade-off between accuracy and performance, and the optimal values will depend on the specific requirements of the buoyancy simulation and the available computational resources. ###### Gravity[​](#gravity "Direct link to Gravity") defines effective gravity. --- ### Modular Vendors #### Overview[​](#overview "Direct link to Overview") We have added some new vendors to our features, and these vendors are called modular vendors. We have added some new vendors to our features, and these vendors are called modular vendors. Modular vendors are vendors which can be placed in your region, and act like a clickable shop. Other users can click on the object the modular vendor script is attached to, and browse through the items you have on sale. You can have an individual modular vendor, which will only display and sell one item, or you can use a catalogue modular vendor, which will allow you to display and sell items from a specific collection, range or line. To make things simpler, in our Editor Pack we have two samples of modular vendors: New Basic Catalog and New Basic Single Item Vendor. You can find these samples in the editor pack under Assets>Sample Art>Vendors>Vendors #### Adding the modular vendor to your region[​](#adding-the-modular-vendor-to-your-region "Direct link to Adding the modular vendor to your region") To add the modular vendor to your region, you need to add it into the region scene where you want the vendor to be. For the vendor script to work, you need to attach it to an object in the scene. Make a new 3D object, such as a cube, by right clicking in the hierarchy, and choose 3D Object>Cube. Place the cube where you want it to be in your region. #### Setting up for the modular vendor[​](#setting-up-for-the-modular-vendor "Direct link to Setting up for the modular vendor") Right click in your hierarchy, go to UI>Canvas. This canvas will be used in conjunction with a panel for displaying the information about your item/items. Drag the canvas in the hierarchy into your cube. Under the Inspector window, make sure the Canvas script Render Mode is set to World Space. In the hierarchy, right click, go to UI>Panel. The panel should automatically be under the cube in the hierarchy. Next, you need to resize the canvas so it fits the cube. To resize it, you can use the Scale tool in the top toolbar. Scale it down until it looks something like this: After the resizing, you can customize the color of the panel. You can do this by clicking on the Panel in the hierarchy, and going to the Image Script under the Inspector Window. Now you need to add a few Text scripts and a RawImage script into your heirarchy. Right click in the heirarchy, and choose UI>Text. This will automatically be placed as a child object of the cube. Duplicate this text script by right clicking on it, and duplicate until you have six Text scripts. Rename your Text scripts in the heirarchy by clicking on the Text script, and go to the Object Name box at the top of the Inspector Window. Rename your texts like this: * Item Name * Item Description * Gold Label * Gold Price * Silver Label * Silver Price You will also need to add these titles to the actual text script as well by changing the text in the Text Script in the Inspector Window. When you name the Gold Label and Silver Label in the Text Script, name them as Gold Price and Silver Price, as the actual digits of the price need to go under the texts you named as Gold Price and Silver Price in the hierarchy. There will be a screenshot of this later on. Right click in your heirarchy again and choose UI>RawImage. Drag the RawImage until it is between the Item Description and Gold Label. The RawImage Script will hold the image of the item which is for sale. #### Positioning the text[​](#positioning-the-text "Direct link to Positioning the text") You will need to lay out the text on the panel to make sure it is readable and also has space for the rawimage. You can move the boxes around with the normal move tool, but to scale the text box, you will need to use the rect transform tool. To resize the text, you will need to change the size in the Text script. Make sure Best Fit is ticked, and set the min to 9, and max to 96. That is the optimal size for the text as it will be readable. Here is a screenshot of the best layout: When you are happy with the placement of the text and image, you can move on to attaching the modular vendor script. To attach the script, click on the cube, click on 'Add Component' under the Inspector window, and search for Modular Vendor. #### Single Item Vendor[​](#single-item-vendor "Direct link to Single Item Vendor") To fill this script up, you first need to pick the Vendor Mode. This can either be single or catalog. For this instance, choose 'Single'. For the product ID, add the product ID of the item you want to sell which is on \[]. Under the UI Fields, you will need to drag the text scripts into the appropriate boxes. So, for the Name box, you will need to drag the Item Name from the hierarchy into the Name box. This is how it should be: * Name - Item Name * Description - Item Description * Brand Name - (You can make a new text script for this and add it in) * Brand Image - (You can make a new RawImage for this and add it in) * Item image - The original Raw Image * Item Icon - Same as Brand Name For the Gold heading, make sure you have the Display checked. For the Gold text field, add the Gold Price text from the hierarchy. Make sure Display Free is set to 'Use world free'. Set Display Unavailable as 'Use Dash Character'. Container Game Object you can leave empty. For the Silver, do the same as above, but drag the Silver Price from the hierarchy into the Silver text field. Scroll down, and set the Interaction activation mode to Collider Click. All of the above information, such as item name, description and price will be automatically taken from the virtual good script of the item on curator. #### Catalog Vendor[​](#catalog-vendor "Direct link to Catalog Vendor") The catalog vendor works a little differently to the single item vendor. The catalog vendor has categories for you to choose from which will sort the Shop. You can set the Primary Content type to whatever you need to be, for example, if you make clothing, you can set it to 'Clothes' being primary. You can also set the catalog to filter items. These are the filters: * Filter by Brand - This will only show items from a specific brand. If you want to have every item you have created show up in the Shop, this is the one to choose. * Filter by Creator - This is pretty much the same as above;It will filter the Shop to only show a certain creators items. Note - if you use another creators ID, these items will not show on the preview viewer and you will need to publish the vendor to live to see the content correctly. * Filter by search term - This will filter the items by search term. For example, if you put in 'Skirt', all skirts in the Shop will show. * Filter by item IDs - This will filter specific items only using their IDs. You will need to put the number of items you want in the 'Size' box under the checkbox. If you want to add five item IDs, put 5 in the box for example. Activation mode is how the vendor is activated. This should be set to Collider Click; just make sure the object with the vendor component script on it has a collider. Now you can upload your region as normal, and these modular vendors will be in your region for users to buy items from. --- ### Move Object #### Overview[​](#overview "Direct link to Overview") Fields Location the location the target transform will be moved to. ![](https://lh7-us.googleusercontent.com/2Ng3LLjz7GKWZHojwGQEBm3z4MwC5fxcRLGDaJ40uvRHXItHZZ9Jzzg045VKYhJEkY4wdO4QFFI0zEWWfLl9OMpX9OvmjoHC36tXDlLShvHtWZX-oBUQBp5HrENZC8tFYMr4AeRhfdLLatWj-TiR8A8) #### Fields[​](#fields "Direct link to Fields") ###### Location[​](#location "Direct link to Location") the location the target transform will be moved to. ###### Rotation[​](#rotation "Direct link to Rotation") the rotation the target transform will be moved to. ###### Target[​](#target "Direct link to Target") the transform you want to move. #### Usage[​](#usage "Direct link to Usage") This component needs to be triggered by another components event, β€œMoveObject.Fire”. For example, the image below uses a proximity activator to trigger the event. ![]() #### Sample[​](#sample "Direct link to Sample") Place the sample in the scene and walk into the proximity activator to trigger the move object component.
--- ### MusicZone #### Overview[​](#overview "Direct link to Overview") *Fields* Name Sets the name of the music zone. ![](/assets/images/400px-musiczone-0d1699fc1e2d72fd5571768642af7bf8.jpg) #### *Fields*[​](#fields "Direct link to fields") ###### Name[​](#name "Direct link to Name") Sets the name of the music zone. ###### Radius[​](#radius "Direct link to Radius") Set the area of the music zone ###### Clip Size[​](#clip-size "Direct link to Clip Size") Sets the number of clips ###### Elements[​](#elements "Direct link to Elements") Drag the audio clips here info *This component currently is not working, please use other sound related component instead.* #### Usage[​](#usage "Direct link to Usage") Create an empty GameObject and attach MusicZone component to it. Name Sets the name for music zone. Radius Set the radius of the zone/sound to be played within. Clipsize Set the number of clips to be added. Element Drag the each clip in one of the element field. | Format | Extensions | | ----------------------------- | ------------ | | MPEG layer 3 | .mp3 | | Ogg Vorbis | .ogg | | Microsoft Wave | .wav | | Audio Interchange File Format | .aiff / .aif | | Ultimate Soundtracker module | .mod | | Impulse Tracker module | .it | | Scream Tracker module | .s3m | | FastTracker 2 module | .xm |
--- ### NPCCrowd #### Overview[​](#overview "Direct link to Overview") Fields Female Clips Size set the number of custom female animations Elements Drag the animations here Male Clips sets the number of custom Male animations Male ID Sets the number c ![](/assets/images/400px-npccrowd-18c6b2819446172e9ace00a7370d2086.jpg) #### Fields[​](#fields "Direct link to Fields") ###### Female Clips Size[​](#female-clips-size "Direct link to Female Clips Size") set the number of custom female animations ###### Elements[​](#elements "Direct link to Elements") Drag the animations here ###### Male Clips[​](#male-clips "Direct link to Male Clips") sets the number of custom Male animations ###### Male ID[​](#male-id "Direct link to Male ID") Sets the number custom male outfit IDs ###### Female ID[​](#female-id "Direct link to Female ID") sets the number of female outfit IDs ###### Max[​](#max "Direct link to Max") Max number of NPCs to spawn ####
Usage[​](#usage "Direct link to usage") Female clips: this sets the number of custom animations you want female NPC to have. After setting the size drag animation for each in the element field. Male clips: this sets the number of custom animations you want male NPC to have. After setting the size drag animation for each in the element field. Female IDs: this sets the number of custom outfits you want female NPC to have. After setting the size drag outfit ID for each in the element field. Male IDs: this sets the number of custom outfits you want Male NPC to have. After setting the size drag outfit ID for each in the element field. Player Outfit ID Log in to and click the "Outfit" menu button. Create and save the outfit you want for your NPC. You will see when you save your named outfit that a unique number is added at the end. MAX: this sets the max number of NPCs to spawn --- ### NPCs #### Overview[​](#overview "Direct link to Overview") Non-player characters (NPCs) and other bots can be deployed easily β€” baked into regions or placed like furniture as spawnable items. #### Creating an NPC[​](#creating-an-npc "Direct link to Creating an NPC") Setting up an NPC takes three steps: position it in your scene, give it an appearance with an outfit ID from sine.space, then add interactive functions and submit. ![Position the NPC in the scene](/assets/images/npc-creation-6784a1bb7ca2c8a661bfa2e53d41ab52.jpg) *Pictured:* Position the NPC in the scene. ![Grab the outfit ID from sine.space](/assets/images/npc-3-890a3ccb361096c45992b0532cec476b.jpg) *Pictured:* Grab the outfit ID from sine.space. ![Add interactive functions and submit](/assets/images/npc-2-26bf175cb4cf8b2237f9f69e3e7dd94e.jpg) *Pictured:* Add interactive functions and submit. #### Statue component[​](#statue-component "Direct link to Statue component") See [Statue Component](/sinespace-sdk/components/statue.md). --- ### Pool #### Overview[​](#overview "Direct link to Overview") Field Swim Set the swimming animation Swim Idle Sets the idle animation Splash template sets the small splash effect Big Splash template Sets the splash template for bigger splash ![](/assets/images/400px-pool-2280803f57b0cde38a54e18e57114556.jpg) #### Field[​](#field "Direct link to Field") ###### Swim[​](#swim "Direct link to Swim") Set the swimming animation ###### Swim Idle[​](#swim-idle "Direct link to Swim Idle") Sets the idle animation ###### Splash template[​](#splash-template "Direct link to Splash template") sets the small splash effect ###### Big Splash template[​](#big-splash-template "Direct link to Big Splash template") Sets the splash template for bigger splash ###### Splash Sound[​](#splash-sound "Direct link to Splash Sound") sets the sound for splash effect #### Usage[​](#usage "Direct link to Usage") Add this component to your water, add a box collider to set the area of the water, and check IS Trigger to enabled. Swim Drag a swimming animation here, this will override avatars default swimming animation. Swim Idle Changes the idle animation of avatar while he/she is in the area. Splash template you can drag a splash effect for big and small splashes here. Splash audio this sets the sound for the splash effect. --- ### Proximity Activator #### Overview[​](#overview "Direct link to Overview") Fields Ignore Owner If checked it will ignore owner. ![](/assets/images/500px-proximityactivator-256d2be8aeb09fb5683ee7bde53b5a28.jpg) #### Fields[​](#fields "Direct link to Fields") ###### Ignore Owner[​](#ignore-owner "Direct link to Ignore Owner") If checked it will ignore owner. ###### Client Only[​](#client-only "Direct link to Client Only") check to set script to client only ###### Minimum Distance[​](#minimum-distance "Direct link to Minimum Distance") Sets the minimum distance for activation ###### Maximum Distance[​](#maximum-distance "Direct link to Maximum Distance") Sets the Max distance for activation ###### Event Activate[​](#event-activate "Direct link to Event Activate") Activates the function when avatar comes within the range. ###### Event Deactivate[​](#event-deactivate "Direct link to Event Deactivate") Deactivates the function when avatar is out of range. #### Usage[​](#usage "Direct link to Usage") This can be used to open/Close doors. Activate deactivate particle effects. Auto light the interior of a house etc. Trigger Ignore Owner: If checked this script will ignore owner. i.e not will happen if owner is within the rage. Trigger client only if checked the effect will only trigger on client side. i.e triggered effect won't be shown to all avatars present in the regions. (better performance in certain cases.) Distance Set the closest and farthest area of activation. Eg: If min is set to 0 and max to 1. it will activate when any avatar is within 1 meter of the object. If min distance is set to 5 and max to 10, it will only activate when avatar is between 5 and 10 meters of the object. Events Activate Click the add sign then drag the item to be activated when avatar is within the range here. Then select what function should be activated. Eg: Particle system function select start. You can click on add to add multiple items and select function for each.
Events Deactivate Click the add sign then drag the item to be deactivated when avatar is out of the range here. Then select what function should be activated. Eg: Particle system function select start. You can click on add to add multiple items and select function for each. --- ### QuestCounterClickable #### Overview[​](#overview "Direct link to Overview") Add the Quest Counter Clickable component to counters the user must click on to collect. Add the Quest Counter Clickable component to counters the user must click on to collect.
![](data:image/jpeg;base64,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)
Counter ID Enter an ID of your own creation to the Counter ID field and add the same ID to the Counter ID field of the Counter quest step or the Startable Timed Counter component. --- ### QuestCounterProximity #### Overview[​](#overview "Direct link to Overview") dd the Quest Counter Proximity component to counters the user must be within a certain proximity of in order to collect. dd the Quest Counter Proximity component to counters the user must be within a certain proximity of in order to collect.
![](data:image/jpeg;base64,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)
Counter ID Enter an ID of your own creation to the Counter ID field and add the same ID to the Counter ID field of the Counter quest step or the Startable Timed Counter component. Trigger Distance Specify the distance from the object that will trigger a successful collection. --- ### QuestGameObject #### Overview[​](#overview "Direct link to Overview") This allows you to rez and and derez items in your scene during specified quest steps. This allows you to rez and and derez items in your scene during specified quest steps.
![](/assets/images/questgame-0cb89dd26cc192246f889ee49fb1ba73.jpg)
Configurable parameters: * QuestID * MinStep * MaxStep Attach to other objects (preferably a parent group, if you're updating multiple in a single step) It enables or disables the object it is on, based on whether the user is inclusively on any step between Min and Max. Objects can only be seen by the player. --- ### QuestNPC #### Overview[​](#overview "Direct link to Overview") To turn any object in your scene into the Quest NPC, add the Quest NPC component to it. To turn any object in your scene into the Quest NPC, add the Quest NPC component to it. (You might normally make the Quest NPC a humanoid NPC, with the Statue component on it, rendering it as a character, but you can add the Quest NPC component to anything with a collider on it that the user can click to start the quest.)
![Questnpcscript.jpg](data:image/jpeg;base64,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)
Once you have added the quest NPC component to an object in your scene, drag that object into the Destination NPC field in the first step of your quest. Now when a user clicks that object it will allow them to start your quest. --- ### SailStrip #### Overview[​](#overview "Direct link to Overview") Fields Resolution sets the resolution Points Size Sets the size Gravity sets the gravity amount Curvature Sets the curvature Need Update sets update to ?? ![400px-SailStrip.jpg](/assets/images/400px-sailstrip-faccdfb5d98f94b188120ad0194c1dd4.jpg) #### Fields[​](#fields "Direct link to Fields") ###### Resolution[​](#resolution "Direct link to Resolution") sets the resolution ###### Points Size[​](#points-size "Direct link to Points Size") Sets the size ###### Gravity[​](#gravity "Direct link to Gravity") sets the gravity amount ###### Curvature[​](#curvature "Direct link to Curvature") Sets the curvature ###### Need Update[​](#need-update "Direct link to Need Update") sets update to ?? ###### Always update[​](#always-update "Direct link to Always update") Sets to update all time Attach this component fill ? --- ### SceneBackgroundMusic #### Overview[​](#overview "Direct link to Overview") Fields Server URL of the shout cast server Port port of the shoutcast Playing Check this to stream music. ![](data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEASABIAAD//gBJRmlsZSBzb3VyY2U6IGh0dHBzOi8vd2lraS5zaW5lLnNwYWNlL2luZGV4LnBocD90aXRsZT1GaWxlOlNob3V0Y2FzdC5qcGf/4gxYSUNDX1BST0ZJTEUAAQEAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAxAABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLUhQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAACGAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAAAIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVzYwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPtzAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUigiKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1hPaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t////2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAA0ASwDAREAAhEBAxEB/8QAGwABAAIDAQEAAAAAAAAAAAAAAAMEAQIFBgf/xAA2EAABAwIEAgkEAgIBBQAAAAABAAIDBBEFEhQhk9IGEzFBUVJVkdEiMlRhI3EVgRZCYnKUwf/EABgBAQEBAQEAAAAAAAAAAAAAAAAEAgED/8QAHREBAAICAgMAAAAAAAAAAAAAAAECAxESIRMx8P/aAAwDAQACEQMRAD8A+kVRxH/NQMgMWgcC6Qll3NI7r/v5QIpy9hiZRNdI1jj1jBlcwBubrnOP3C/02G226pjHTx8p9/dJJy383CI6+7cDpVidXR1b46SnbM+RrWhzpHN6nMNn2Gzmg3JHb2LuHHW1dzp65LWiemGYhitBU9HqSnimraKWACaQsL5y+5+pxOwaQNze4JGxCmmNTMPWPSSDpNicrsHH+FOWtYXzuzvaKYggdXuy5kF7m9hsbErjqrT9LcZkp6R7+jcjJJpY2PzSPDI2uiZJ25L5ruLbWtdh3CCxi+N4zR9NWUcFG6fB204lkdHTue8nJK42I2vdkYt/3Wsb7BBT9KcWrcNcRg76Kd8FW5kjw946yMfxhoy7l181nWFgRuUEMfTTEIKLATiGDugqK+RsErZ3OY5j+sjZYAN3cQ8yW+3KO1Bapek+NvOFano45muYZCI5XuMQuQA67BZwtcg22Itc7IIYemOKyxQyN6OTgG3WBxeC36YC4D6dyHSvHh/Ef9BPQY1jdaekr9GaY0sIFFFJE4/yAyglxsM18rCQLgAix3QVJOlXSGhbU/5Ho8XSxta1rIHOeC/qM5s4A3Dn7Dw2B3QW5+k2KtqahseBVD209TPEGx3d17GQvewh1rXc5obbuJtugvYhi1S2n6OPa+OBtfWxw1EjGktY0te7KM4BBc5oZcgHfbuQc/BOkOMyOijxPDwHSV2mdUCN7YI2ZS7MNs57m/UBZ3abIKtR0wxilpqerrcFjpoZ2gMY6R5yl1QyJuc5Lh1iXZRe4AQYd0lxw3kqKRlCXVeHtgpXxuMkrJgBKwkixLSXG7dxk3FkHvjsSAbhBhAQEBAQEBAQEBAQEBAQEEdRm08uS4fkdlt23sbIPn/R/pBQvpsJo2Zm4hKWskZKw5w4W3u4Zgb3v/tXZKViszCWlrctS6OLu6TQ9LTPSsqJcKjIeI4yzq3RBpL2kH6jKXZctjbt/ahVPa0TzLTRyOY6MvaHFj/ubcA2Nu8IMH7j/aDjMqoC+XraenJEmX6bWFydy47X2/Rv3IJTiwYY80TwJMpaMwB3v7nbsQXKGd1TStke0Mc4kOaHXAIJH/xBYufE+6Bc+J90GLm1rm3ggzc+J90GrmtcWlzWkt7CRcj+vBBm533O6DNz4n3QLnbc7IAJHYT7oFz4n3QYcA77gHd++6CNsTHbuknDyL7PJ7z++xaiu4YtbUxCpNLHHVSxyZnMjaHgCZxN9tzvZtr947Be6y20NXC572tgqXmMix6/Ykgm4N/Dv70EVVXsa1/URSgskDbzTFoILS7b6h4d/j3oLGrpdTJEG1H0FgLnTFo+rxJO1v2gjjrIhSQyysnDnuyH+Ut3uBtc/sWHfYoN31cDA3PFUjNH1o/mN7bnx/W/ht4oAq6cucQyodECQHic2Nr/AL7LC90FaGtkMbZH08jo9iXsmda2W5A37b2t3Wugs6umdKGR9e4Hse2UkOAeG7boLlGyGph6xplAva3Xl3vY9v6QTaSPzS8V3ygaSPzS8V3ygaSPzS8V3ygaSPzS8V3ygaSPzS8V3ygaSPzS8V3ygaSPzS8V3ygaSPzS8V3ygaSPzS8V3yg0mo4crpPrL2gkOLySP9oKtfUyU7WGNgde9yQT/Q27ygvwm7LkWJ7vBBofuP8AaDjf8kw1kc0lVPpIYphBnqCGBzySAAL3HYe0A237EFkYph73g6mLM0kAm47yDYnwsQfCyBh2MYdiWQ0FXFUB7S9pjOYWBIvf+wR/pBfQEBAQEBAQEBAQB2oIoKOsniZIKmBrTfK0wkkC578yCfRYh+dDwDzIGjxD86HgHmQNFiH50PAPMgaPEPzoeAeZBrJh9dJl6ysgdlOYXgJsfH7kG2jxH86LgnmQNHiP50PBPMgaPEfzoeAeZA0eI/nRcE8yBo8Q/Oh4B5kDR4h+dDwDzIGjxD86HgHmQNHiH50PAPMgaPEPzoeAeZA0eIfnQ8A8yBo8Q/Oh4B5kDR4h+dDwDzIGjxD86HgHmQNHiH50PAPMgOosQcCDXQkHY/wHmQYFBXfmU/8A655kGaPP1RErmue1zmktbYGxt2IMH7j/AGg48GG4PWumkp2xVDhKC97J3PLHtvtfNdtszthYblBaOHUD3xRup4nOpw/Iw75BKCHbeDhdBvRUFNQi1LFku0MJzFxLQSQLknsLj7oLSAgICAgICAgICAO0IIKbEp4zHSx0rHyFrnsaZWB72hxu7LmvZBa1mI+mHiN5kDWYj6YeI3mQNZiPph4jeZA1mI+mHiN5kDWYj6YeI3mQNZiPph4jeZA1mI+mHiN5kDWYj6YeI3mQNZiPph4jeZA1mI+mHiN5kDWYj6YeI3mQNZiPph4jeZA1mI+mHiN5kDWYj6YeI3mQNZiPph4jeZA1mI+mHiN5kDWYj6YeI3mQNZiPph4jeZA1mI+mHiN5kDWYj6YeI3mQZ1mI+mHiN5kGlE5zoXOewseXuLmm2xudkC9n38DdB549FqdkVO2Kedj45uufIbuL97gC5+m3YLbDfbdBZwjAqfC6t1RBlMj6dkEjiwZnlpJDi7t79x+gg66AgICAgICAgICAgDtQUoKOFmK09dJK8PiaAYg1pBcBIGnNe4FpXbd5t4IO1rY/JL7D5QNbH5JfYfKBrY/JL7D5QNbH5JfYfKBrY/JL7D5QNbH5JfYfKBrY/JL7D5QNbH5JfYfKBrY/JL7D5QNbH5JfYfKBrY/JL7D5QNbH5JfYfKBrY/JL7D5QNbH5JfYfKBrY/JL7D5QNbH5JfYfKBrY/JL7D5QNbH5JfYfKBrY/JL7D5QNbH5JfYfKBrY/JL7D5QVqe+V5Itd7jb+zdBr/179l0HkWYTjdJTmWCr66rd1xyvkOWMu2aRmuCbb72FwNggmEfSOSFzXSwdfHFC4EsaGmWxz2NuwEC3/kfAIN4/87Bi+HwyyST0hkf1krWMt1YDrdYQ3Y7stlt2G90Ho0BAQEBAQEBAQEBBXFbHFhlVSPwrrahxlDZdKHE5icpz2/Y3ugnaCGtB7QACgygICAgICAgICAgICAgICAgICAgIJYvtP9oI3fcf7QYQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBBLF9p/tB//2Q==) #### Fields[​](#fields "Direct link to Fields") ###### Server[​](#server "Direct link to Server") URL of the shout cast server ###### Port[​](#port "Direct link to Port") port of the shoutcast ###### Playing[​](#playing "Direct link to Playing") Check this to stream music. ##### ##### Using an audio file that is in your Project Assets[​](#using-an-audio-file-that-is-in-your-project-assets "Direct link to Using an audio file that is in your Project Assets") Create an empty object in your scene that will be used for your region. Under the Inspector window, click on Add Component and add an Audio Source. Add in a suitable audio clip from your Project assets. Select the output as "Music" (if its left as "None" it may play but at a reduced volume level). If you want the audio clip to repeat, tick "Loop". ##### Using audio from Shoutcast[​](#using-audio-from-shoutcast "Direct link to Using audio from Shoutcast") You can also stream music from Shoutcast into your region. Create an empty object in your scene that will go in your region. Under the Inspector window, click on Add Component. Search in the search bar for Shoutcast Streaming and click on it. Add in the server and port from Shoutcast and check the box playing to have the music playing in your region after uploading. --- ### Simple Networking #### Overview[​](#overview "Direct link to Overview") Fields Network Name Networks that share a name will communicate with each other. ![](https://lh6.googleusercontent.com/28z4599zjSGtI5bPhqQ77KLdVYMShFu2uHnl6F7zTCDfRjGRPJBIaBgYodrjtqzkjglbca2MPXxxkNRU8EKk7_ZqOhsHwN4gNQag_V6rLoeHG7fLGe1xnfTn9L8dY-BxWgR-mklk1H-L3s28NCeOL2s) #### Fields[​](#fields "Direct link to Fields") Network Name Networks that share a name will communicate with each other. Minimum of 20 characters network name. You should make this something unique unless you want cross/talk to happen. A common networking name is to use a DNS format, such as space.sine.mycoolwidget where you have a unique prefix just for you, followed by an application name. Loopback Does this networking component react to events it sends. Instanced If enabled, appends this object’s global unique ID to the network name, so that multiple copies of the same object will not cross-talk on the network. Events A list of events you want this component to react to when sent over the network. --- ### Simple State Machine #### Overview[​](#overview "Direct link to Overview") Fields Component Name See networking. Bindings Auto Bind To UI If enabled, state machine will automatically attach to Toggles, Buttons,Sliders, and Dropdowns on the same object at runtime. ![](https://lh7-us.googleusercontent.com/saQ_gHP1Mz9A5aA04kEGBebS9NZRSjbQtj70ebyty2zM0mCEF0j1GRzjxhSoGSUkT-_8Z9wj0J5eB9Q1yfsq7NGj7zNM-_jfgo5YJ4JrDtQfq7HAvg90h9LJhjB3Dv4-_hyZdvB_gJy1_K2b9mEwEzw)
#### Fields[​](#fields "Direct link to Fields") ###### Component Name See networking.[​](#component-name-see-networking "Direct link to Component Name See networking.") ###### Bindings[​](#bindings "Direct link to Bindings") Auto Bind To UI If enabled, state machine will automatically attach to Toggles, Buttons,Sliders, and Dropdowns on the same object at runtime. If you have a slider with a range of like 1 to 10, you can create 10 states called 1, 2, 3, 4, etc and it'll switch between them automatically as you move the slider around. You can skip numbers too. If you have 1, 3, 7, 10, then basically 1,2 will use the '1' state, 3,4,5,6 will use the '3' state, 7,8,9 will use the '7' state, and 10 will be itself. If there's no exact state match, and you are in between numbers, it rounds down to the nearest available state. You can also call StateMachine.BindUI(object) to bind it to UI elements on some other object, 'auto bind' only works if there's something on the same object.
###### Networking[​](#networking "Direct link to Networking") NetworkedState If enabled, state machine will network its state to all other users in the scene persistently that have the same component name. NetworkedUnique If enabled, state machines on different objects will not work together even if they have the same component name.
###### State Settings[​](#state-settings "Direct link to State Settings") Start State 0 or 1 will be the first state in the list as default. States are 1-based, so 1 is the first state in the list. Wrap States When reaching the last state, does it wrap back around to first state again (and vice versa). Exit State On Start Automatically run the Exit Event on all states except the start state when component starts. Redo States If told to switch to the state it is already in, redo the events anyway.
###### State Events[​](#state-events "Direct link to State Events") StateChangeEvent Event that happens every time the state changes, no matter what state it is coming to or from.
Machine States A simple state machine typically consists of a set of states, events that trigger state transitions, and actions that are performed upon entering or leaving a state. --- ### SliderVehicle #### Overview[​](#overview "Direct link to Overview") Using this component(with Slider Physics), you can create a silder-type vehicle(for example, a sledge). Using this component(with Slider Physics), you can create a silder-type vehicle(for example, a sledge). The core parts is same as the Module vehicle so you can check [here](/sinespace-sdk/vehicles.md) for thouse value settings. The slider physics decide how the vehicle moves exactly.
--- ### Speedometer #### Overview[​](#overview "Direct link to Overview") Fields **Rigid Body** The rigid body of the vehicle. ![](https://lh7-us.googleusercontent.com/j7nbJ_sENRGJg4hz4Xv9H3O5fnljE2ZgwIckuFqQhsEsmDtAvvI7WOtgbglE_gzjbzs7ZV_TCNoqT9VqRrYW9yUxkJ1yBx9iOVJavoRMZ-_uX2zKsDXlBwUEfucvYPpeLfKCvNbXC1fwit-Ah57i0cc) #### Fields[​](#fields "Direct link to Fields") **Rigid Body** The rigid body of the vehicle. **Meter** The UI text element. **Use Imperial Units** What it says. **Animator** Use a custom animator( for example an animation moving a speed dials arm) **Animator Float Variable Name** A float variable will be fed in, in meters per second. #### Usage[​](#usage "Direct link to Usage") create a UI Text Component under your vehicle object, and another empty game object with this speedometer component. Attach the rigidbody of the vehicle and the UI Text component to the slots of the speedometer, you can leave the rest option as it was, or fill it on your own request. Change the position and style of the UI Text as a normal UI element as you wish. And, remember, disabled the Canvas object at the beginning, and activate it by the events function as I present above.
A simple example here, is a meter with blue text in the right-bottom corner: ![](https://lh7-us.googleusercontent.com/xLUFmJPIpJytEk_5fC68lvdLJ0ozaw3D9yB2_DQe_I_TIch7dnDaR4ue4NLzVzcwMUyW1lMV8CVFLMJJURoaNBukO3Fv6ZShEo_sfiSvZxBeEGH0R5w7Du1nwcj__YnYtBevifd6CiBTRQndELV1j3M)
--- ### StartableClothingRequirement #### Overview[​](#overview "Direct link to Overview") This requires the user to wear a specific clothing item. This requires the user to wear a specific clothing item.
![](data:image/jpeg;base64,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)
Clothing Item ID1/ID2
Allows you to specify for instance one male and one female item. You can identify the ID of a clothing item from the virtual goods component attached to the gesture once it has been submitted, or from the item list in your account at curator.sine.space --- ### StartableGestureRequirement #### Overview[​](#overview "Direct link to Overview") This will require the user to play a specific gesture before the quest moves on. This will require the user to play a specific gesture before the quest moves on.
![](data:image/jpeg;base64,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)
ItemID The item ID for a specific gesture you need played for it to succeed. You can get this from the virtual goods component attached to the gesture once it has been submitted, or from the item list in your account at curator.sine.space Any Tick this if you want playing any gesture to complete the quest step. Min Participants Defines the minimum number of gesture participants required to complete the step. So, for instance, you can set to 2 and tick Any to require the user to do any two person gesture with another user. --- ### StartableItemRequirement #### Overview[​](#overview "Direct link to Overview") This requires the user to have a specific item in their inventory before the quest continues. This requires the user to have a specific item in their inventory before the quest continues. They do not need to use the item; they just need to have it in their inventory.
![](data:image/jpeg;base64,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1HEVu/vK3f3lbv7yt395W7+8rd/eVu/vK3f3lbv7yt395W7+8rd/eVu/vK3f3lbv7yt395W7+8rd/eVu/vK3f3lbv7yt395W7+8rd/eVu/vK3f3lbv7yt395RM39x+g3RlbYjnyq01n6eqr3FRdOs9fTZQZ08EOg4TGaFzWyUCQhl0OHQeL4enonFxFTjMy+3CisjNZOI0iprp/2UQxKKnU6DbQzQpDA4RKwz3RpKSY5lJeKpz24jNMh/hbL7679XI7CtuwrbsK27CtuwrbsK27CtuwrbsK27CtuwrbsK27CtuwrbsK27CtuwrbsK27CtuwrbsK27CtnCtHCtHCtHCtHCtHCtHCtHCtHCtHCtHCtHCtHCtHCtHCtHCtHCtHCtHCtHCtHCtHCtHCtHCtHCtHCtHCtHCtHCtHCtHCtHCtHCtHCtHC5HL//xAApEAEAAgECBgEEAwEBAAAAAAABABEhMdFBUWHB8PFxgZGhsRAw4UBQ/9oACAEBAAE/IW9/VsnrNkKtBY3kQdRE1EsfiNm2muSvtCWgZtbj1myes2T1myes2T1myes2T1myes2T1myes2T1myes2T1myes2T1myes2T1myes2T1myes2T1myes2T1myes2T1myes2T1myes2T1myes2T1myes2T1myes2T1myes2T1myes2T1myes2T1myes2T1myes2T1myes2QUyNSjAfScTnJB+y3C0ChS3DfK+TEggAOZ04QYFY6J/iU+0bROgyYdZmQdAvCDWTQULU1azwlA6aF5BOZLlAFZopiBkpC89+494KcoefEt8Y9DW7TVjxY64z0iRXE1VWllsfacYSYmx5jHT8xUYw8C3ro+KYf4AE3YrHWNaMV+xEVdFowegq055jQKZhDrMq08uabo83ZZS5/EsBADktxoWnpczF6uC9GcfErA1a8W8XZGRsbtiuCyZPniZiwPxaIvRAtfFyiS0sRV166zN8CLD8HL+OkvfLwvExXCX4qezKGlCU64mVjBLf66vzCRg0Kzwyn3z8TOjmcS8ljpDoL8imUvjr15cJyHb4NLBj3gpyh58S3xlegNMt+WSvzKVNk2HoVX0zcpgg2ljyu/3KJFIiheRr934nI9ngUtD/AITYc/1sz25eQtyr9wOAATMopQKLdH+xnWiagOTny5ojqwKKMEWNbUAGvkEVIdECjWuv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)
Item ID Put the ID of the item here. You can identify the ID from the virtual goods component attached to the gesture once it has been submitted, or from the item list in your account at curator.sine.space --- ### StartableRoomVisit #### Overview[​](#overview "Direct link to Overview") This requires the user to visit a specific region for the quest to continue. This requires the user to visit a specific region for the quest to continue.
![](data:image/jpeg;base64,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r+srV/WVq/rK1f1lav6ytX9ZQ9E309k0YTfeF3aDmImU3EcQQ1xPMdI8E3C4AGxDhrqEyIPZunTVYeI4Rz5erpQ5aQ9zp7zK7M0cOC7DGfp/RYlNOYbA9CsQvpBe6eH0CxcmZ4jXt4vCP6LtMSkQIAb9k31TnljKCA3mzyny80XjDwmcMUsyDk4U4dVRcOI95nwVNOHz1dn+H0/7TMNoYYcHGTEZzGizGf30JvAdFtustt1ltustt1ltustt1ltustt1ltustt1ltustt1ltustt1ltustt1ltustt1ltustt1ltusts2W0bLaNltGy2jZbRsto2W0bLaNltGy2jZbRsto2W0bLaNltGy2jZbRsto2W0bLaNltGy2jZbRsto2W0bLaNltGy2jZbRsto2W0bLaNltGy2jZchX/8QAKRABAAIBAgYCAwADAQEAAAAAAQARITHRQVFhwfDxcaGBkbEQMOFAUP/aAAgBAQABPyFiU44A5fE9ZshF5RLORrjMw64Jsjzmaugf4TRAVmpeEes2T1myes2T1myes2T1myes2T1myes2T1myes2T1myes2T1myes2T1myes2T1myes2T1myes2T1myes2T1myes2T1myes2T1myes2T1myes2T1myes2T1myes2T1myes2T1myes2T1myes2T1myes2T1myes2T1myes2RMkTotJzBRqXjYLZV1V6XzI3Ii2/wAOXWD1PNY/4mR/I2iNGjSNcI1oJgFlFkKGljTjMMxSDnObxmSwhSxzhGHDnnS3tAOkcpn9jpMsFDNnNn9vqGAIGU+y/wBEuMZh1FTnj7+4FG0iwceX7hRhKgpxVB6i/n8VROpSkv4qy664+JhVREGDcHJ+5myD+qcCq1nO4ubfRpmWgc1BbvTUhdlMG7NU84xyOPAdH7+oCOrdg6c6zzq4PJTW5qcSz+KgCFsiwK5sdefScUEDwb19ETbaBj1fxywIzm9NXG7wfiFH6TBA4JRrxgKwCw/l3r+JrBmxKVpnHXn0jF9bn5NP7/6BWcE2HDBn4hsrQLHX/iKrvwHKfmEh2hn7t5+ek459P/IAdIgC6iqpEvXIkwWVspXpWqvOXxLVWI/kGCwbLb3hLQQm1H2PZC/DlK7grQDbrmFZGig+kVagoEUXrUcVdWBoNA6T9ATmuV8prI4TFiud4HmuV8osw14V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)
Background ID Put the region ID in this field to specify where the user needs to go. --- ### StartableSitRequirement #### Overview[​](#overview "Direct link to Overview") This requires the user to sit on a specific furniture item. This requires the user to sit on a specific furniture item.
![](data:image/jpeg;base64,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)
Target Object Add the SeatImproved component to any game object in your scene and then drag that game object into the Target Object field. Remember this item can also be animated so you could for instance use this step to fly someone from one part of your region to another. The step will complete as soon as the user sits so you may want to make the next step not initiate automatically but require the user to click another Quest NPC object to continue, if sitting initiates a sequence that you want to play out before the next step launches. --- ### StartableSnapshot #### Overview[​](#overview "Direct link to Overview") This requires the user to take a snapshot with the in world snapshot feature. This requires the user to take a snapshot with the in world snapshot feature.
![](data:image/jpeg;base64,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)
Number of Snapshots You can specify the number of snapshots the user needs to take in order to complete the step. --- ### StartableTeleport #### Overview[​](#overview "Direct link to Overview") This step will teleport the user to a specific location in the same region as the quest. This step will teleport the user to a specific location in the same region as the quest.
![Startableteleport.jpg](data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wgARCABeAcsDASIAAhEBAxEB/8QAGgABAAMBAQEAAAAAAAAAAAAAAAIDBQQBBv/EABcBAQEBAQAAAAAAAAAAAAAAAAACAQP/2gAMAwEAAhADEAAAAdiPvhfDyyufPRx37XbPFhFfQQ+b6Tepxqjeu+e1yPZn8ZrXfPD6FgxN2GT0Hddg9hoMTkPpYZV5qLRUtFS0VLRUtFS0VLRUtFS0VLRUtFS0cdVmXcbGf15s1tW8Gpm1+ewIWco63EO4AAAACEwAhMQSkyqEq231895Z5yWl9cbRLmkXuWRf7V1lK4UrhSuFK4UrhSuFK4U1dY55+1E7uTrKyJJidp2+53poMga7OrNVXYAAAAAVwv6TmAAAAAAAAAAAAAAAAsrsK4ygV2cXp0e0QOryHUQ8sHnoAAAAAc1XcxQ8q1cpmTeQLEIlqUQ9pLUfCb2J6ptPTlOp4PULyt3Dhdw4XcOSxznRZwd5WVFUZeFHTZIhcAAAAAAAEa0DormKq+kUXejkutFUpiFXQOLqmHnohXeIVdAqlMQl6L1AvUC9QJQ9EOnm6Svn5xPh6xXYGgzxoM8aDPGgzxoM8aDPGgzxoM8d8OIbTFG0xRtMUbTFG0xRtMUbTFG0xRtMUbTFG0xRtMUbTFG0xRtMUbTFGp7ldJ//xAArEAACAgEEAQIFBAMAAAAAAAACAwABEwQREhQhIjEQIzAyQAUgJFAVNEH/2gAIAQEAAQUCukjPlcLQAljHeh5QTEtT/H5jSimMJYqosYReFsXhbMYTNo5jCLwtmMJjCYwmyubMKqLrheMJYLqqBd1srmvC2sYTGExhMYTGExhMYTGExhMYTGExhMYTGExhMYTGExhMYTGExhMYTGExhG0ILEdxEAuM1OnWygC6pYbPXzDhj0/K6KuVW7eaStrxsDVqE0Bfa67dNj1DC1F6xYuHUcXinSUVK4l/larUdzi8Usti0fyepdakkVp8P6hq/Gr1K2DqPX3hU+xYTeVLOtfpPOr/ACNV/rr1dYNKXNZaR1WkWLOvaX5quNzb6xCJfsIBOvO/rl7jOHr2KCHCXyGr5VPVUot7vlU2KbFNinqmxTYpsU2KbFNimxTYpsU2KbFNimxTYpsU2KErnBHhPaVdFVe0LyNcp/0vF0Pq/B3uHNvX8yWGzfWVeYPPN6pVFxHnmXysPVtQcX/g37nW8Cr3r2/GsqGZF/DzPM8zzPM8zzPM8z2nmeZ5nmeZ5nmeZ5nmeZ5nmeZ5nmeZ5nn9le0ut6pxq0eq3wXZ6dGU7pbLpp6k8dt4WeobxC+S/pgXHUPbvp/6GvaXVFWFWxCJiKlhVqWQ2pd1hVtxG6IAOvqM4crx3WVcyrmVcyrmVcyrmVcyrmVcyrmVcyrmVcyrmVcyrmVcyrmVcyrmVcyrmVcyrmVcyrmVcyrmVcyrlGJfGvaFy2UxnANWBjepqi7i7dp2E3T/AFx+/f52otgUzVL00LUCqdpZCWpVVP1GNbdSCAz+unBbE6gHXTb7Y6tRUzUiuj1SQ1GnZbhHIylOLCepWtg6gCYeq56enCN3qAoK1I8gv5u1TaptU2qbVNqhfe07GKYRXXt8LQNpHTiNs05E4U8TUvEH16+61LuFQGBgJmSllCVyYWnUUsF3R6cGVagsxUumAta4a1sKkLqapWacByroVxXy7FaxAkLJlLXUHTrqWpZMxrx2tdwNqZzGcxnMZzGcxnMYV7mQUYgsV1XtGHS1i7czeArtgUfMfwbGrtQrcvAMwDMAzAMwDMAzAMwDMAzAMwDMAzAMwDMAzAMwDMAzAMwDMAzAMwDMAzAMwDMAzAMwDMAzAMwDCVQyvaPC2afg02DoypTUNY4F/wAv8Ct+WnBoD/QM+2vbtrnbXO2udtc7a521ztrnbXO2udtc7a521ztrnbXO2udtc7a521ztrnbXO2udtc7SrnZVOyqdlU7Kp2VTsqnZVOyqdlU7Kp2VTsqnZVOyqdlU7Kp2VTsqnZVOyqdlU7Kp2VTsqnZVOyqdlU7Kp2VTsqnZVOyqdlU7KoOpDb//xAAbEQEAAgIDAAAAAAAAAAAAAAABAAIRITBAcP/aAAgBAwEBPwGVtlg77Cw5V8G//8QAGhEAAgMBAQAAAAAAAAAAAAAAAAECEWAhQP/aAAgBAgEBPwEaHHnoirHh7xn/xAA9EAABAwMDAQYDBQUHBQAAAAABAAIREjGRAyEyQRMiM1FhkgRxoRAjQEKBIDBSwdFQcoKx4fDxFENzk6L/2gAIAQEABj8C3DAnFrWGEGl+lUbChEFjZHojGlpxPVHR7JmwkkKj7uryRpDDBgwuDcINIZJsPNcG4TqA00upO3VOoDTS6k7dVwbheLoZC4NwnUBppdSduq4NwuDcLg3CohlUTCBeGiTA7qh3ZtJ6FcG4UlrAApDWEFUQyqJhEsDTBg91cG4XBuFwbhcG4XBuFwbhcG4XBuFwbhcG4XBuFwbhcG4XBuFwbhcG4XBuFwbhcG4XBuFwbhcG4XBuFwbhSNNkyAJHmVU6gD/w/wCqdswx1DY6Kk6duRpsuAwuDcLa4Th6LUaDGo546xIQr5UCfqpY+nUa4oCZMEuPqvuqi1+pL2vZsPWV8XGlqnUqJaJduP8Af6r4oDtfydns79YndaDy7X1Gy6oySRt6Jpa3UaBqhsCqC3z8kaW6oJ+JJN6aFr0BzZ+JJO35UanudvsXNhVwaewiY9US5+oPvNgGkgt/yWvQHNn4kk7flWkDq6pn4gCYLTHl5r/uR23+Ls0wTqifiNj+aj1TCTrPb2cVyTvK+DceFRz0T36NRc6AWFktd+qd2naUbdnTMfrC+K1Dqa4Ic/s2zfbZNZVrV/8ASg0tnktLU1Rqb6QBLZ5L4xw4VDPX8TI6OafqqesAIn/dgns0y0aep9F2cN7Jrdvt3Wzyf8a6/qf3wqaDBkT+xDmhw9VtC/0W7mhV9yqLx0VxhUtob6AKSRt6LcjC3c1QNRhW5GFcYVxhXGFyarjCuMK4wrjCuMK4wrjCuMK4wrjCuMK4wrjCuMK4wrjC7wYfm1U90D0C3Ugz9pRjy2JbCbFcTvK3qiv+SY51XX8CV/mmnvT6CUxxBF7J/Ldp23umu72U/Y7sO26MVRLb/Nbk38lqxedsLqd29PVbk38lLapo6+aMVxLbr81vM/gxHQ2RJ/EbuA+a5s+iurq6urq6urq6utldXV1dXV1dXV1dXV1dXV1dXV1f9qFoOHVlTnO7y7t6mi8dQi6mxtWXTlaQBZU8VT0Rt39WD/60HimJfJibFahhoa3UAcf0C06GS58n9MprjsSP3jf7p/ktT+6f7EgiQU0dkyG2EWVLmhw8iobptaJnYKksaW+UIgsaQekIDs2QLbWTgWiHX9VD2hw9R+9E6lB+ag/EbfMLxG5XiNyvEbleI3K8RuV4jcrxG5XiNyvEbleI3K8RuV4jcrxG5XiNyvEbleI3K8RuV4jcrxG5XiNyvEbleI3K8RuV4jcrxG5XiNyvEbleI3K8RuV4jcruuB+R/Z7pAPqJTn6jmECoQGxY/NAtBMuogecSoofcA+hKOkN3bjYhMe5tJI/AH5KnaIQdpnTiWthzJuY80G6xaX3MbfzWsdSw1KW+0JhZpufWCe7HRAhpc2mskCwWsWaRc7TxaU12owtnoSNvqtUO03NDdRrQ4R6f1VFJvAd0JTfu3NqbU2rqE7S7M0hoNW3qnd090tBGxuY6Ik6L9m1OAjYLsTymOiJdpFkOI6eae5jmjvwJbNlpP1aXHVikMbbafNabHtgvjqEG9m4S4tDjaR/wq9HTfu5rQdupQYWv6AuMbFF3ZuIDqbdaoUHR1B3qTMbFajDvG4+R/bHyTQ2KnGBKLXRIAMgRf9g6e8E1fWUDU4muvf5QpaYYSHO38lUHuiZp6KgOJAtPT8Aemyuav4kGucdiDbyKqGo9hiDT1TjU4EurkdDELTPbPhrXAnqZj0QFTmimggdR5LVBmNXlt6Qu9ram7aCYuMJxrd3iHER1Ef0VdTr1BvQFacF33bKB9P6Ikud3m0uA6j/ZRnUe7jcfwmfJHs3U1Npf8sIvGo9s7kDqnQ90EzEWT9+6XVDZaLZd91xxCL63iXBxAHkm7u7ry/M/1R77ySWmSPIz5Kup16i3oSqJdFdf/wBSnbu7zw/Ef0T3uO7vTor/AEV/or/RX+iv9Ff6IR5KHLu/Uz9rnmzRKpcxzCbVdVquaQ46YkgFBhe0ONhK5Dy/AkmrYflJVbe1AkjclXf7yrv95V3+8q7/AHlXf7yrv95V3+8q7/eVd/vKu/3lXf7yrv8AeVd/vKu/3lXf7yrv95V3+8q7/eVd/vKu/wB5V3+8q7/eVd/vKu/3lXf7yrv95V3+8q7/AHlXf7yrv95V3+8q7/eUCC6/8R+3UYLuaQmu1KGhu4DTK1GbSdMsDi8n/hTIpqaR3jt+i1Hb09Pn1/AupEmlObqNaO8T3XTcz/YP6/ZZys5WcrOVnKzlZys5WcrOVnKzlZys5WcrOVnKzlZys5WcrOXE4XE4XE4XE4XE4XE4XE4XE4XE4XE4XE4XE4XE4XE4XE4XE4XE4XE4XE4XE4XE4XE4XE4XE4XE4XE4XE4XE4XE4XE4XE4XE4XE4XE4XE4VnL//xAAqEAEAAgEDAwQCAwEBAQEAAAABABEhMUHxUdHwYYGRwXGhEECx4TAgUP/aAAgBAQABPyFynPUIiohXAQoPUcn9wEu1sIFlQjKnDXSbwPKwemmsUXpe+r+Jq46gNJs+s4xA0b7gumtG84xN0S0dDU0m6JaOhqaTjH8b8Ym6JaOhqaTjE4xOMT4xkuutdIziBrFXQAIgvpVAs4xG5gtUACFzBYgIk+MZLrrXSM6iaRE1EScYnGJxicYnGJxicYnGJxicYnGJxicYnGJxicYnGJxicYnGJxicYnGJxiXpHoRYBfzCOxVnM+SWBVRWaEOnvFetp6HjbeDHXLyZQf4JobeIHdbr+aiWFSWzDo03AU1zy3m4VkFFFwiuEgmCuO6SGDfHen24JsJLI6ZHRfWFa2lkA5eohhr6nEVW0vpFg1AX6Ae0OcSOFuej6Qv3MBWqsmi+0DM3snWMUq/M/wAqle2+sSLT5SS6fFwv3MBWqsmi+0KwpWxmy1H5zD/tNb5v9wD4YF0yz/16Rla0JWvSm1bOJ6Ep6WIAvF9j/BH0X6139zriZCBqAagauuK6S3sIJfOrQ/dx2K0TMzDWh+p6Eo6UP7K4gVoD0LBjV7QGv7nQNSvYo68VbLcfXrGNYlwbt2tfLJofwBDISmX3Ha0n7gRW0u6P+wbXXHpLLqy3Nf8ApooahdJuev8A8ZjhdGyN1YAblxBrQdV94ws7qlfcAgLdTXbaXelzzXeUykylH8tXLksFrbvKNjLDVu11iAoAyqf9gkudAz9yjYyw1btdZ5rvPNd55rvKtWQzVf8AZ5rvPNd55rvPNd55rvPNd55rvPNd55rvPNd55rvPNd55rvPNd55rvPNd4P8ApyYAKOCqooFQBuykIdRuaH8AGiiIhqx0JVHkg7EBQZ6p0evtLVLTFLafvrE6ZGrjJV16f0TX8II1+coacADT+0QbhYNYXZVh1lqwBXhhhVL9QlrlIonNle2vpHaW7XB2M++kpFDvGd3q12gsa1sWqts3X6gAZpWvvjGO3NUsrC9Vgsa1sWqts3X6jKjWTemmKv3h+FDK9c67VAR3mmwvN3/S0/xEDF5PVABJYFNXjdrE0P8A5QUwNZPT+lm7nGRn5grvfmLeBL4CXwEvgJfAS+Al8BL4CXwEvgIWAVBgAJfAS+Al8BL4CXwEvgJfAS+Al8BL4CXwEvgJfAS+Al8BL4CXwEvgJfATVtb/AJ0P4BldJTSj8kaSwbdGB63WXOa6RmqRYzvZVZkikFit+MFDRvod5TtSqrUrBnOv6ZsvNBs0OH8hB0KteAMGBvTVz+Jb4ABTTmfwp7EDWBHBgVRSM0m/XEcoAKDdNdd//QnPmwR+v+X/AOFofw5MCkSxJvULq0vTpHSjqNj7Q6KUAhfX8wieNjKX+IjehUUXT6IoplsJy1siwDQp0VnriVuzNEkAAAoND/0VghGsBp/P4iVYWE1/1ONzjc43ONzjc43ONzjc43ONzjc43ONzjc43ONzjc43ONzjc43ONzjc43ONzjc43ONzjc43HqW1oH+dD+CmbRanxZ/sa+PItoatNv3rEUS4DgtQ1odYCWs+KqUOfU0uFqzQLChaVd7b0esdOGo1TYNlLj85/oAbi8PudHqdIWEmIVjawddPSOPgsIQvWm3xbF1lYsGqVbRuuWFR24FQgd61YiSANT6L+9Okpaltoo1s2lmTTMOu2uxp+3tcE6nMjeI5dfRp6zH2KYFDUN9nbZgAZXA2Oi9T5iPRy4vdm6xWmt7VH8sNFdJqTX3iMqxFivLms0wYxcasF0Ku9zQjGgK8GkbLkrPrpKqOx1gwdEzY7yowOD2XRtXp6RANQDaK1SXfwJKkoMFrLNb3SwwAJpost19HdLItslcooUNb5NMZghdLgzoTPXy8ReAQ4o1UNO9ml6xsXhaupj5GekT0iekT0iekT0iAKisvqBiydoMLb7EuPXUXLVhyOHE0P5XbY2xYv3xih5KZfTNKheqN3qNq9Df2gOK1lMnV0vfrADA40w2MGn9BVatgCF9YF+dg3/kdBy9rUE26kvsNoVTo2erp1ilG4LJDDHQ36srAaK6xeisPTaoUAoDaPRY9XTrFuSWLdGGOhHglWkvNr7nSvWV5wZwUQ6XsJlbBoGxqmL3d92b1xaOnVjXCGNlMYza4vFtKmcM69DA0G7HyNprS9mLXq7kc5gDYZ1xexpF7x1+CVWsXld4AdFmVZeUcdb+YEKq5Dmnnjoza5CRUVtexvMHxFh1ybaZ/qZO1uRpNOr3mMsSAaGi4vY32J+kg3f4dL/UyfMWHXBtpj+4MiAAFgabeq+89R8u09R8u09R8u09R8u09R8u09R8u0BFkFskbFZ+aqMAOW1RP5XLND+AfVLDWguVxesU+CKR2OQtlF09IGArUW+0EQEVRnVNT+i3tb69RsawQiKBnCji/SeUfc8o+55R9zyj7nlH3PKPueUfc8o+55R9zyj7nlH3PKPueUfc8o+55R9zyj7nlH3PKPueUfc8o+55R9zyj7nlH3PKPueUfc8o+55R9zyj7nlH3PKPueUfc8o+4PYwatv+ZofwiZRb0tKgHUVJZRMqGyzJjZ4r9HHshm8boqCKUKdHL1ilEAwTcFj2D5f6OmmiFoXO8v4A1NTTIaXKejKejKejKejKejKejKejKejKejKejKejKejKejKejKejKejKejKejKejKejKejKejKejKejKejKejKejKejKejKejKejKejChs2f7NCcQd5xB3nEHecQd5xB3nEHecQd5xB3nEHecQd5xB3nEHecQd5xB3nEHecQd5xB3nEHecQd5xB3nEHecQd4oz8LvOCTgk4JOCTgk4JOCTgk4JOCTgk4JOCTgk4JOCTgk4JOCTgk4JOCTgk4JOCTgk4JOCTgk4JOCTgk4JOCRR+if/2gAMAwEAAgADAAAAENB9oDDALBDDLNBAAAAAAAAAAAAA0XBDPAAAAAAAAK0CHGJBCAAAAAAAECPBBJCCAAAAAAKMMMMMEMMMMMMMMMAFFCMMAIAAAAAItOMONNNONPNNMMMIFBHCAAAAAAAAJPLDPPDPLLLPPPPPDHHHHDDDDDDDDMMMMMMMMMMMMMMMMMOP/8QAHBEBAAIBBQAAAAAAAAAAAAAAAQAhETAxQFBg/9oACAEDAQE/EIqCRHDkMNSxq4PLlIm51/8A/8QAHBEBAAICAwEAAAAAAAAAAAAAAQARQFAhMDFB/9oACAECAQE/EIYCQC5kGOYKe0L3SD3N+Vr/AP/EACkQAQACAQMEAQUAAgMAAAAAAAEAESExwfBBUWHxgRBAcZGhIDBQsdH/2gAIAQEAAT8QIMBYDs/UeKqiiwUGjxKongAjpRnK8sUKkbpMaNP6ls8G2liaHWR6xrNYMuAKJvIdcENUqpi707p8vQRajQXkczn20wW3JoXYzQy1pOfbRfF88NQXVmSzzF8Xzw1BdWZLPM59tORbzn20XxfPDUF1Zks8zn2059tOfbTf63ruZYvS4Me4LWpAVfBDfRbfxg5Zz7aLpYfgWquADrB0sfwLETCJ1m/1vXcyxelwccw2tQAieSc+2nPtpz7ac+2nPtpz7ac+2nPtpz7ac+2nPtpz7ac+2nPtpz7ac+2nPtpz7ac+2nPtpz7ac+2nPtpz7aNDDwBYqF0IWuhKh2Wa5LoQuHsfiJEJAAhbKnRr0l+4AsMD5LtH/mYPxAAJL7iYnihwxL5s0TV7kAGb73SuOR+LqgDdAlHW9dG8awhORkD8f+6wbNircnqBGxl3FIXYVX4x4IndKswbVlYog3piXfZ1VSBcG2janMsaxFNFLECqcvXQaj+VRpEAo1G6F3SpRNNAiha27h0LDle74n5atRS5rLLjEGbI4qsIgaNQoNMpebkViApBUF3+rf2uTr+xhmtag4nr46AQQpVWhLF0gzZHFVhEDRqFBpjqLCiihWCwtZKpoUC+telZ4XhKZM5K6FgtGrSuqWmIDWNhTBgMLS7Z2hPuir8rGo9P6L8DoohbFFRnFLToXh4oG+8URFBReooRWZlyukFnVLwvwYoAPwhmzWG0aeVLtnWFPmqr8rS/uXSnSK0k/ALLbqVnNCwZxgYrvKB0NdzYIbbtUAKyrVWPbU7S7LGz2bsMCL+IfwfQbhQHqOsqjGhXfqKkiBQ0XRacZf3BAZKm0dBx311NomWBItlCra+T9n+zoshPRrNBeEz/AIYM6pbBsacWMoAgWxdeyQW12hEBW9q0P2wngBbECjI2DWls98itb8L3Og7kt8wIkt6oC1gjaCt2QB8kh1CUIAaqxr8KInroQRtBW7IA+ST3yPfI98gdlCFbYN01+D+me+R75Hvke+R75Hvke+R75Hvke+R75Hvke+R75Hvke+R0See2Uixp3SjS6h1StSg+YURdBB+SfwfTSL1AJoeYkFloA6gCOuCsRGky1Yz5yq/wuqzGUti6hvQmRRWuousqqqCl9mrXZlcYzofY/wAXeV4jfwLxXxADQCmF1YAuaMnZzMo6pSJkjABW8dHQhipkdiEIuWqhjF9GoYIIa2BoVWwaL6TIBshjDQpFzoB+eieqOHAKgywp7YZQB0O/n/B0tePMVAogoVI51LK+Ic4+YURZjgtrBWOsoA6Hfz/g6WvHmWCwpSRb+hMaQsGFYxWvm0PGvSZogrURqyQwlDjtn7L+v/2THFzsFaSs4sUS+oTPZ6Um19QbNOxP4P8AFcUKxNVJZ8KfP2TdUGgHBgwETgLGedw8TzOHieZw8TzOHieZw8TzOHieZw8TzOHieZw8TzOHiVKCAAA0AqeZw8TzOHieZw8TzOHieZw8TzOHieZw8TzOHieZw8TzOHieZw8TzOHieZw8TzOHieZw8TzOHieZw8TzOHieZw8REEIKMB/19f4PoxpUxoSsII+REhQ74sWFK3NgpQMEpIMxaBTRCKKZBZbXVUvAgN6CL5SDwn0qzQBSHNmErpM+tPAlNxXYBdR0zD4vhQ1UKIsKD5FLat0Bu68oSulXS4YmdXXEmRWOhFhodMfpQKAwC9TD/soK0i+jFzo0y+9v+C/g+iCOHkCkRwidIGW3Z2m1NUlziU3rpazZaw5B+JQmhcVqgHRi9alIBkjZbEVdr+4TUDAACiUoAPYDpGRAcxGwVhXKnWacGZTFh8AZ6AQ0jgESaNJUFICgKA7f7CWkYKIXgOLH6lBuKgo6mLTl+85fvOX7zl+85fvOX7zl+85fvOX7zl+85fvOX7zl+85fvOX7zl+85fvOX7zl+85fvOX7zl+85fvOX7zl+85fvOX7zl+85fvOX7xuTlkAd6H6/wAH0Sj6tQzmwji+jaFtquS236Immqp0ZCrERyi2mdQQKXVNNd0KGqE60ucQOsz4uEuCgHIsWEKsJjqQAJWhGGT7CoCldnmK/hjS7uYtnQIABQBw6s5xdsTDKAOWiU0payEyK5vvuNS0Ha9CXMIKLIqVQBSjTS4tXMYFllo00qC0msSgnetGGwU2FsHGi2w5AzVWnVMhf4HEBo8qLSBbJqgp6hqGzWvr21eR1QOBahYuiI1iWBM91oqzMSFVBRFdtmVFWpbJQ+ghEbG+rLLoGmS0cGFpATvABXDYUy3UHQYeYHeogXlMx/g1cA4WqAWobZERDyydOJNmWoACusu3EVaGlBVB0OuFTQSWRcBe2gvmKuUQOhrkKWhRSqNbxNbQAVFSp1UUJQC0cuNvlFqr5KIRkEjCKGNRUQtqxCqMpBwZ17Rot9XQVuoi/sOCUBVrQx7Vdtr6Keinop6KeinopUBa+jzDqlPFSwBSlmLLaLLuUdiwmqGRNyVMaXR/B9SA3gbEsWVQsCJRTeY6XTe+ioB1KAz4xLrU5q4a+od1Maqy2iH1WfIKawtupQeOxJgChYDF291+wCsyi0b7B7watdoDL36PjSAdKAFgXYhfi9NZTJBXTVLGqaGiWzAs+g5C3ZWBA3+hCNFZ1NlDshHQ6BX7KuslNFFoaReYvHCOo0pgU98r+IPu5ghYaImsLYyjZ6uyWBhpxdJeLzB5rSx7S1HqoMAXMpGdK3k0F9UUZcaUxlT0qVLMNkVqzZiPJrSAopgQLBxk7OYuEHUeXwXo6tWjjPBdwUA2YwDYEAbldGx6sDDkFE+KiBqI9EphqQ32dMqnZi1QO9kcVmumI6T5rPUq6YkAdavM75H82OexhNcZObDdFDEgLQOGVFDl0pq62teAtQ6IHINT5sfiX9Gte68ztkfxY47mU1zkYonqniCaK5Nq7YZq3/IMGDBgwZOABUg2YyHaXR9HCSNESkTuNkCLzIDS0ODuz+D6C0tUUhBaF0d4C9QVlMpZAZq7q2sMuD/8CYFtqrJK25iizkTaYdO0DTEBW1R3SmzpT9iZ+V2DSmltY0BXSVhAH7elYysOe4OP+BcOHDhw4cOHDhw4cOHDhw4cOHDhw4cOHDhw4cOECcCA4ajRn8H0FZdWgQFoWre0YKMvtGhhgBlRvEytIIVlLcFgpbxRhBZE9RqhNgnQUVcaoMsg3g6mrOo9/scwACzcUEChfWmuzMxOWm6RTwF5vLjSeunrp66eunrp66eunrp66eunrp66eunrp66eunrp66eunrp66eunrp66eunrp66eunrp66eunrooIHXPCfwfbnDhw4cOHDhw4cOHDhw4cOHDhw5lbaq1I47vOO7zju847vOO7zju847vOO7zju847vOO7zju847vOO7zju847vOO7zju847vOO7zju847vOO7zju847vOO7zju847vOO7zju847vOO7zju8LgBbsdH+xI7vTu/M//9k=)
Target Drag any game object in your scene into the target field to teleport the user to that location. To ensure they do not arrive on top of a tree or similar, it usually makes sense to create an empty game object exactly where you want them to arrive. Delay Allows you to add a time delay before the teleportation. A small delay (1 second) is recommended to ensure all actions as part of the prior step have time to complete. A longer delay might for instance be used in conjunction with a specific gesture playing in the prior step. --- ### StartableTimedCounter #### Overview[​](#overview "Direct link to Overview") Startable Timed Counter is a game component you can add to your quest, requiring the user to collect a number of counters inside a specified time frame. Startable Timed Counter is a game component you can add to your quest, requiring the user to collect a number of counters inside a specified time frame. Use this startable in conjunction with objects in the scene that have either the Quest Counter Clickable or Quest Counter Proximity component attached.
![](data:image/jpeg;base64,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)
Number required Specify the number of counters the user needs to collect. This can match the total number available in the scene or there can be far more in the scene than the required number, depending on the nature of your game. Seconds Limited Define the duration of the round. If the user fails they can reclick the NPC to restart the step. Counter ID Add whatever ID you have manually applied to the Counter ID field of the Quest Counter Clickable or Quest Counter Proximity component attached to your counters. --- ### Statue #### Overview[​](#overview "Direct link to Overview") Fields Gender set the gender of the NPC Name Set the name of the NPC Player outfit ID Sets the outfit of the NPC Material Sets the material of NPC skin and outfit Skip material Cha ![](/assets/images/400px-statue-script-65ff48bd585fe93136f7a2b37c563d1f.jpg) #### Fields[​](#fields "Direct link to Fields") ###### Gender[​](#gender "Direct link to Gender") set the gender of the NPC ###### Name[​](#name "Direct link to Name") Set the name of the NPC ###### Player outfit ID[​](#player-outfit-id "Direct link to Player outfit ID") Sets the outfit of the NPC ###### Material[​](#material "Direct link to Material") Sets the material of NPC skin and outfit ###### Skip material Change ID[​](#skip-material-change-id "Direct link to Skip material Change ID") Skips material change for outfit if set to 1 ###### Scale[​](#scale "Direct link to Scale") Sets the scale of the NPC ###### Disable shadows[​](#disable-shadows "Direct link to Disable shadows") Toggles shadows on/off ###### Cull Distance[​](#cull-distance "Direct link to Cull Distance") Sets the culling distance ###### Do NOT Cull[​](#do-not-cull "Direct link to Do NOT Cull") Disables culling ###### Animation[​](#animation "Direct link to Animation") Select the animation NPC should Play ###### Random Position[​](#random-position "Direct link to Random Position") Sets random start position for the animation #### Usage[​](#usage "Direct link to Usage") The Statue component is most commonly used for creating [NPCs](/sinespace-sdk/components/npcs.md) within a scene, it allows you to dress your NPC using any clothing or accessory you can own inworld; both your own virtual goods and any item you buy or are given by another creator. Apply the script to an empty capule collider in your scene, or use the NPC template prefab in your Space Editor Pack.
Name NPCs are easily distinguished from real avatars inworld because they do not have hover text showing their names over their heads. However, you can still give your NPC a name in this field, that will appear in quest dialogue steps. Player Outfit ID For more information how to get the player outfit ID, please see [Outfit IDs](/sinespace-viewer/outfits/outfit-ids.md) Enter just this number in the Player Outfit ID field. Rendering settings If you want to apply a material on top of the NPC you can add it here. You can make your NPCs look like holograms or stone statues etc. If you want store mannequins that show of a specific item, add the store ID of that item to the "Skip Material Change ID" field. This will allow you, for instance, to create a silver mannueqin with just the sunglasses you are selling retaining their original materials. You can get the item ID from the virtual good component attached to it; the ID will appear as soon as the item is submitted. Scale You can enlarge your NPC to the status of a giant towering over the scene or shrink it to a sprite. *Statues (and avatars in general) will not respect Unity embedded scales on the Transform. This is to prevent them from being scaled when you have them seated on an object which is not 1,1,1.* Disable shadows / Culling distance You can use the NPC system to deploy crowd scenes; where disabling shadows and optimising draw distance on each NPC will improve performance. Custom animation By default your NPC will use the standard Space idle animations. You can override this here by adding your own animations. See here for details on importing and rigging animations for Space avatars; [Single Person Animation](/sinespace-sdk/avatars/gestures/single-person-animation.md) Random animation position Tick this and the animation will launch at a random point in it's timeline. As above this is useful for any kind of crowd scene where you do not want multiple NPCs doing identical moves in sync on the screen. --- ### StreamingBackgroundMusic #### Overview[​](#overview "Direct link to Overview") *Fields* Url's Size No of songs Element Enter URL for each song. ![300px-Streamingmusic.jpg](data:image/jpeg;base64,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) #### *Fields*[​](#fields "Direct link to fields") ###### Url's Size[​](#urls-size "Direct link to Url's Size") No of songs ###### Element[​](#element "Direct link to Element") Enter URL for each song. ###### Shuffle Loading[​](#shuffle-loading "Direct link to Shuffle Loading") Check to randomize the list. info *This component currently is not working, please use other sound related component instead.* This allows you to stream music in your region from URLs. Create an empty object in your scene which will be in your region. Click on the object in the hierarchy and then click on Add Component under the Inspector window. Search for Streaming Background Music. This will add the component to your object. You will see the component has settings called URLS and Shuffle loading. If you click on the drop down arrow next to URLS, you will see it has a Size option. If you have 3 URLs of songs you want to add to you region, you would enter the number 3 in this size option, press Enter, and three element boxes will appear. You then add the URLs into these boxes. If you have ten, you would add the number 10 and so on. Shuffle loading unchecked will play the songs in the order you have added the URLs in the URLs settings, and checking it will shuffle the tracks. --- ### SubstituteAnimationZone #### Overview[​](#overview "Direct link to Overview") Fields Walk Male Overrides walk animation for male Walk Female Overrides the walk animation for female Run Male Overrides run animation for male Run Female Overrides the run animat ![](/assets/images/500px-substituteanimationzone-15ce8774a25d6ba9addc500b5251f655.jpg) #### Fields[​](#fields "Direct link to Fields") ###### Walk Male[​](#walk-male "Direct link to Walk Male") Overrides walk animation for male ###### Walk Female[​](#walk-female "Direct link to Walk Female") Overrides the walk animation for female ###### Run Male[​](#run-male "Direct link to Run Male") Overrides run animation for male ###### Run Female[​](#run-female "Direct link to Run Female") Overrides the run animation for female ###### Idle[​](#idle "Direct link to Idle") Overrides the idle animation #### Usage[​](#usage "Direct link to Usage") Create an empty object, add component search and add Substitute animation Zone. Add a box Collider to define the area of the zone; check is trigger on the collider. Drag animations you want to override in this zone into substitute Animation Zone script fields. --- ### SyncedPhysicsDoodad #### Overview[​](#overview "Direct link to Overview") Fields Unique Name Gives Unique name to the item Usagto e Attach this component to share the updates with the server. ![](data:image/jpeg;base64,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) #### Fields[​](#fields "Direct link to Fields") ###### Unique Name[​](#unique-name "Direct link to Unique Name") Gives Unique name to the item #### Usagto e[​](#usagto-e "Direct link to Usagto e") Attach this component to share the updates with the server. This will mirror to all client, and the object will appear synced. For example, if you attach this component to a beach ball with rigid body enabled, everyone in the region will see the ball movement same time. --- ### TeleportLocal #### Overview[​](#overview "Direct link to Overview") Fields Destination Drag the destination object here Teleport Local allows you to set up a teleport from one point within your region to another in your region. ![](/assets/images/400px-teleportlocal-3e76c82585128b9c15ca0d2a364ab519.jpg) #### Fields[​](#fields "Direct link to Fields") ###### Destination[​](#destination "Direct link to Destination") Drag the destination object here Teleport Local allows you to set up a teleport from one point within your region to another in your region. #### Usage[​](#usage "Direct link to Usage") Add an object into your hierarchy to be the starting point for your teleport system. Click on this object in the hierarchy, and click on Add Component. Search for Local Region Teleport in the search bar and click on it to add it to the object. No need for collider nor trigger : the avatar need to reach the object's "Transform coordinate" to self-activate the teleportation process. Add another object into your hierarchy to be the end point of your teleport system. Drag this item from your hierarchy into the Destination box under the Teleport Local component. When you upload your region, the teleport objects will allow you to travel from where you have placed the first teleport to a spot in your region where you have placed the second teleport. --- ### TeleportPad #### Overview[​](#overview "Direct link to Overview") Fields Name Location Name Teleport FX FX Instance GameObject Usage Use this component to link large scenes together, allowing the user to access popular locations easily. ![](/assets/images/400px-teleportpadcomponent-d3990138f0ab8d1a0d8e8cda6e470a33.jpg) #### Fields[​](#fields "Direct link to Fields") ###### Name[​](#name "Direct link to Name") Location Name ###### Teleport FX[​](#teleport-fx "Direct link to Teleport FX") FX Instance GameObject #### Usage[​](#usage "Direct link to Usage") Use this component to link large scenes together, allowing the user to access popular locations easily. The object this component is attached to needs another collider to detect avatar stepping on it/colliding. To do so add component - Box/capsule collider and set the collider to is trigger. If the collider is not set to is trigger it will not let avatar pass through it. Teleport FX should be a timed particle effect or other object which is instantiated when the user arrives at this pad; at the pads location. --- ### TeleportWorld #### Overview[​](#overview "Direct link to Overview") Field Custom Destination Name Name of the destination(This doesn't have to be the regions name) Custom Destination Background ID ID of the destination Region (Must match an existin ![](/assets/images/500px-teleportworld-f3019f17001cba887b8b0e6d7f56c663.jpg) #### Field[​](#field "Direct link to Field") ###### Custom Destination Name[​](#custom-destination-name "Direct link to Custom Destination Name") Name of the destination(This doesn't have to be the regions name) ###### Custom Destination Background ID[​](#custom-destination-background-id "Direct link to Custom Destination Background ID") ID of the destination Region (Must match an existing region id)Usage #### Usage[​](#usage "Direct link to Usage") Create a portal or an object which you would like to act as world teleport. Add component, search and select "Inter-Region Teleport (TeleportWorld)". No need for collider nor trigger : the avatar need to reach the object's "Transform coordinate" to self-activate the teleportation process. Once added, set a Name for destination region. Then click on destination background ID and add your region background ID. Region background id is show in the Scene setting when you upload a region it is right bellow region URL. You may also find the *Region background id* on your *Curator page* then *Items* list. --- ### Timer #### Overview[​](#overview "Direct link to Overview") Usage Fill the Target time in seconds if you want the timer to stop by certain time. ![](/assets/images/400px-timer-da931c99fed97e514b9016d2bbbfbff0.png) info *This is a new component and may not included in the current Editor pack. It would add in the builds later(after Feb 14, 2019)* #### Usage[​](#usage "Direct link to Usage") Fill the Target time in seconds if you want the timer to stop by certain time. It is necessary if you choose "count down" type. Now there are 3 format: HHMMSS is stand for hours:minutes:seconds, MMSS means minutes:seconds, and the last is only display seconds. If you need to display the fraction after seconds, pick "Show fraction" option. You can add Events here, and trigger them when: 1\. Pick the option "Call Event When Timer End", the events will be fired when the timer reaches the Target time(or decrease to 0 from the Target time if count down); 2\. Fire the events once in a delay after the timer start if the value here is above zero; 3\. Fire the events every certain time by the value set if it is above zero; All these method can be used together, which means you can trigger the event after a short while for the first time, then repeat it periodically, and trigger it last time when the timer reaches the preset end. The component offer a default output method, so you can directly drag a game object with Text Component into the slot, the timer will display in that Text Label. But if you want to construct your own way for output, call the function OutputByFormat(), which returns the string of current value of timer. To start/pause the timer by event, change the bool value of timeRunning, where true start the timer and false pause it. To stop and reset the timer, call the function of ResetTimer(), it will set the timer back to the initial state you set. --- ### Tip Jars #### Overview[​](#overview "Direct link to Overview") Usage Add the component "Charity(Tip jar)" to the object you want to create as a tip jar.\ Then you can add room furniture and virtual good component to make it as a furniture, or #### Usage[​](#usage "Direct link to Usage") Add the component "Charity(Tip jar)" to the object you want to create as a tip jar.
Then you can add room furniture and virtual good component to make it as a furniture, or simply add virtual good component and choose generic type to make it a spawnable object.
The tip jar component is already contained other function necessary like clickable, so normally you don't need to add other components.
Just like the image below is enough: ![](/assets/images/tipjar-76d0b0411e212fd644d640a36a202017.jpg) --- ### UpgradeAccountNPC #### Overview[​](#overview "Direct link to Overview") Usage To add this component, simply choose an object you want as an NPC. ![](/assets/images/400px-upgradeaccount-497d62da2d5d94ecd6378eb8ddaeda99.jpg) #### Usage[​](#usage "Direct link to Usage") To add this component, simply choose an object you want as an NPC. This can be an object or an avatar NPC that will be included in your region. Choose the item in your hierarchy. Under the Inspector Window, click on Add Component. Search for UpgradeAccountNPCBaseInternal in the search bar and click on it to apply it to your object. This will add the component script to your NPC/object to allow you to click on it in world once you have uploaded the region. --- ### Vehicle Physical Animator #### Overview[​](#overview "Direct link to Overview") .png>) Fields Animator The animator of the mesh (e.i. ![]() #### Fields[​](#fields "Direct link to Fields") Animator The animator of the mesh (e.i. An animated horse ). Vehicle The object containing the vehicle script. Rigid Body The vehicle's rigid body.
--- ### Vehicle Respawn #### Overview[​](#overview "Direct link to Overview") .png>) Usage VehicleTemplateArray can spawn some random cars(need test!). ![]() #### Usage[​](#usage "Direct link to Usage") VehicleTemplateArray can spawn some random cars(need test!). If you want to spawn a specfied car, fill its item ID(get it from the Crutor page) in Unique ID slot. You can also add some sound effect for denied noise and spawn noise.
--- ### Vendors for your business region #### Overview[​](#overview "Direct link to Overview") Having vendors in your region will make it easier for users to shop for your items. Having vendors in your region will make it easier for users to shop for your items. There are different varieties of vendors to use in Sinespace. You can have a vendor which only shows specific items or have a vendor which shows a range of items like a catalog. #### Creating NPC Vendors[​](#creating-npc-vendors "Direct link to Creating NPC Vendors") If you want to place a NPC in your region as a vendor, you can do this as well. You will need to create an empty object in Unity by right clicking in the hierarchy and choose 'Create Object'. Add the Statue component to this. Alternatively, you can customize the sample NPC found in the Editor Pack. The NPC sample is under Assets>Sample Art>NPC. Once you have the NPC in Unity, you can see how to set the NPC up on the [NPC statue](/sinespace-sdk/components/statue.md) page. Once you have added done this, in the Inspector window, click on 'Add Component' and search for 'Modular Vendor'. Add this to your NPC. --- ### VIPCollider #### Overview[​](#overview "Direct link to Overview") Fields Invert Invert behaviour - block VIP users instead Usage This component when attached to a collider, will disable the collider if the user is a VIP user (or the opposite if 'Invert' is checked). ![](/assets/images/400px-vipcollidercomponent-696bed85a8e2b93fce32352bc191999b.jpg) #### Fields[​](#fields "Direct link to Fields") ###### Invert[​](#invert "Direct link to Invert") Invert behaviour - block VIP users instead #### Usage[​](#usage "Direct link to Usage") This component when attached to a collider, will disable the collider if the user is a VIP user (or the opposite if 'Invert' is checked). A VIP user is defined as one who has bought real currency (i.e. Gold) within the last several weeks (the status fades over time). --- ### Virtual Goods #### Overview[​](#overview "Direct link to Overview") The Virtual Goods component is added to any item you upload, whether it is for sale in the shop or for your own use, including content used in your regions. The Virtual Goods component is added to any item you upload, whether it is for sale in the shop or for your own use, including content used in your regions. The component is divided into tabs so you can fill in the required information more easily. #### Basic[​](#basic "Direct link to Basic") Use the Basic tab to set the content type, category, audience rating, and customization options. **Content Type** is where you choose the broad content category. For example, choose `Clothing` when uploading an item of clothing. **Category** places the item in the correct shop category. For example, if the content type is `Clothing` and the item is a jacket, choose `Clothes > Tops > Jackets`. **Audience Rating** lets you choose the rating for the item. The available ratings are `Everyone`, `Teen`, `Mature`, `Adult`, and `Explicit`. This section also includes checkboxes for content such as violence or adult content. **Customization Capabilities** controls how much in-world customization is allowed for the item. Options include basic, disallowed, full, and source access. The editor shows a short explanation when you choose an option. note The `Pet` type is currently locked and is no longer used. To create a following minion-style pet, choose `Generic` to set it as a spawnable item, then use the pet category if you want to place it in the shop. #### Detail[​](#detail "Direct link to Detail") ![Virtual Good Detail](/assets/images/550px-virtualgooddetail-63e51c78c464e5987148216249a53070.png) Use the Detail tab to add the primary description, optional fields, and translated descriptions. **Primary Description** is where you add the item name and description. Include any special instructions, graphics requirements, file size notes, or other important details. Add your brand name here as well. **Optional Fields** are not yet shown in the shop. This is an upcoming feature. **Translated Descriptions** lets you add translations for the item name, description, instructions, and release notes. Click **Add New Translation**, choose a language from the drop-down, and enter the translation. You can add multiple translations. #### Pricing[​](#pricing "Direct link to Pricing") ![Virtual Good Pricing](/assets/images/550px-virtualgoodpricing-26f4183e01da30198de55093f8e2f547.png) Use the Pricing tab to set the item price and promotion limits. Enable **Not for Sale** if you want to upload an item for personal inventory use without listing it in the shop. **Price Gold** sets the item price in Gold, the premium currency. To sell an item for Gold only, enter `-1` in the Silver field and enter the Gold price. **Price Silver** sets the item price in Silver, the base Sinespace currency. **Promotions** controls whether the item can be used in seasonal or promotional sales. Enable **Allow use in Promotions** to make the item eligible, then set the maximum discount from 0 to 100 percent. #### Icons[​](#icons "Direct link to Icons") ![Virtual Good Icons](/assets/images/550px-virtualgoodicons-136730fc752f324b341da7f0868e2995.png) Use the Icons tab to add the item store icon, inventory icon, and brand icon. **Image Store Icon** is used for the item in the Sinespace shop. You can create it outside Unity and add it to the Project window, or click **Take Screenshots** to auto-generate it. This also auto-generates the inventory icon. It may take a little time for the generated images to appear. The **Brand Icon** is the image used for your brand. You can copy it from Upload Settings in Unity. To add brand information to Upload Settings, click **Space > Upload Settings** in Unity. Under Defaults, add the brand name, brand icon, copyright label, and default inventory icon. After those defaults are set, return to the Icons tab on your item prefab and click **Copy** under Brand Icon to copy the brand information from Upload Settings. You can also add the brand icon manually by importing the image into the Project window and dragging it into the Brand Icon field. The brand image must be a `140x60` PNG. You can add extra preview images for the shop by expanding **Extra Preview Images** and adding images. Preview images should be `1024x1024`. #### Copyright[​](#copyright "Direct link to Copyright") Use the Copyright section to enter the developer name and copyright information. The developer name can be your business name or your individual name. For the copyright, add your name or business name after the copyright year. You can also add copyright information in Upload Settings so it can be copied to other components. #### Upload[​](#upload "Direct link to Upload") ![Virtual Good Upload](/assets/images/550px-virtualgoodupload-8e620ca6636fadf7b858173dcfd5e8c7.png) Use the Upload tab to add upload information for the item. **Status** shows whether you have already uploaded the item to Curator. **Resume Existing Item** lets you enter a resume ID when re-uploading an item. This overwrites the old version. You can find an item's resume ID on `curator.sine.space`, or in Unity under **Space > Items and Status**. **Grid** lets you enter a grid ID to restrict the item to a specific grid. **Upload Content** includes an automatic submission option. This submits the item for upload to Sinespace. After the item is on Curator, the Sinespace team reviews it. If it passes review, the item goes live in Sinespace. --- ### VoiceZone #### Overview[​](#overview "Direct link to Overview") Usage Create an empty object and add voiceZone component to it. ![](/assets/images/500px-voicezone-712f5609e36a50f4800a039ccf04faa8.jpg) #### Usage[​](#usage "Direct link to Usage") Create an empty object and add voiceZone component to it. Add a box collider, click on edit constrains to scale the collider to desired area and check is trigger. The voice will get enabled for the avatars entering this area.
Note: This component Only works on desktop client. --- ### Volumetric Light #### Overview[​](#overview "Direct link to Overview") Features Volumetric fog effect for multiple lights. ![](https://lh7-us.googleusercontent.com/nxg81VeAxTzBhY1FKd-uNzMdZ8nGmdsbRXMyqVJzXIX6UkhepNavwEnMAGDknS6bKMnH_RljwuDWwRkzbrozVGXhMKcBbzQ_XH0gXTe__oWu7saHW6XZJV5mNVy-MzGsD2UEH6Pm2jivPGnnNcrOBSo) #### Features[​](#features "Direct link to Features") Volumetric fog effect for multiple lights. Point, spot and directional lights are fully supported. Volumetric shadows Volumetric light cookies Volumetric noise implemented as animated 3D texture. #### Fields[​](#fields "Direct link to Fields") Sample count - number of raymarching samples (trade quality for performance) Scattering Coef - scattering coefficient controls amount of light that is reflected towards camera. Makes the effect stronger. Extinction Coef - controls amount of light absorbed or out-scattered with distance. Makes the effect weaker with increasing distance. It also attenuates existing scene color when used with directional lights. Skybox Extinction Coef - Only affects directional light. It controls how much skybox is affected by Extinction coefficient. This technique ignores small air particles and decreasing particle density with altitude. That often makes skybox too "foggy". Skybox extinction coefficient can help with it. MieG - controls mie scattering (controls how light is reflected with respect to light's direction) Height Fog - toggle exponential height fog Height Fog Scale - scale height fog Noise - enable volumetric noise --- ### WanderingNPC #### Overview[​](#overview "Direct link to Overview") Fields Start Position set the custom starting position of the NPC Target Position Sets the target positon of the NPC Wander sets the NPC to wander in random direction Max Wander Di ![](/assets/images/400px-wandering-npc-a04fe3e92b425fc023305d9e7452a75b.jpg) #### Fields[​](#fields "Direct link to Fields") ###### Start Position[​](#start-position "Direct link to Start Position") set the custom starting position of the NPC ###### Target Position[​](#target-position "Direct link to Target Position") Sets the target positon of the NPC ###### Wander[​](#wander "Direct link to Wander") sets the NPC to wander in random direction ###### Max Wander Distance[​](#max-wander-distance "Direct link to Max Wander Distance") Sets the maximum wandering distance ###### Rotation SpeedRotation Speed[​](#rotation-speedrotation-speed "Direct link to Rotation SpeedRotation Speed") sets the rotation speed of the NPC ###### Move Speed[​](#move-speed "Direct link to Move Speed") Sets the movement speed of the NPC #### Usage[​](#usage "Direct link to Usage") Refer [Statue](/sinespace-sdk/components/statue.md) to see how to create NPC, once created attach wandering NPCs component to move them from one location to another. Start and Target position: Use this to set NPC to move to a custom location. Wander: Check this to set the NPC to a wander randomly on are set by max distance. Move Speed sets the movement speed of the NPC. --- ### Creating A Shop #### Overview[​](#overview "Direct link to Overview") Mirage Scene Download \* Mirage This page is based on the Mirage shop template which you can download and modify yourself (see right). ![Howtocreateashopbanner.jpg](/assets/images/howtocreateashopbanner-cd13c060731aa2c4acd0123d346bc771.jpg) Mirage Scene Download * [Mirage](http://space-files.s3.amazonaws.com/sample-art/Mirage-Region.unitypackage) This page is based on the Mirage shop template which you can download and modify yourself (see right). We will cover; ##### Creating a shop[​](#creating-a-shop "Direct link to Creating a shop") The Mirage region is built without using any 3D modelling or mesh creation tools at all. Everything in the region has been created with Unity or Photoshop. The base region is approximately 25 mb download for users. Scene set up - interior or exterior scene? The Mirage shop template region is just a skybox. There is no need to create a full environment around this template. ![Mirageexterior.jpg](/assets/images/mirageexterior-0877da0f26fa2b44c96f616ce8c96416.jpg) The building - using simple tools The walls and floors and all the interior props were built using basic primitive shapes in Unity. These can be added to your scene, sized and positioned using the Unity editor's standard gizmos. Once a building has been created, you can add materials to your objects, to combine textures and shaders and create detailed and attractive spaces. You can also choose to use ProBuilder a free Unity asset to build basic or advanced geometry, right in Unity, with zero creative barriers. ![Transformbox.jpg](/assets/images/transformbox-bdb743320ff318d78db88b9a83e24843.jpg) A 3D logo - text extrusion with Blender of Photoshop The logo above the door was extruded from text using Photoshop and saved as an fbx file. You can also use Blender to do this. * [Materials And Shaders](https://docs.unity3d.com/Manual/Shaders.html) * [Asset Store](https://www.assetstore.unity3d.com/) Materials - combining textures with shaders Unity offers a huge array of options for physical materials. You can buy cool materials and shaders in the Unity Asset Store; you can even create your own. Just the Standard Shader which will automatically be applied to any new material you create provides you with enormous power when it comes to creating the look and feel of your space. This region has two different wooden floors and concrete walls. It also has glass panels, plastic fittings and some leather stools, all created using the Unity standard shader. ![Materials.jpg](/assets/images/materials-767682c2522013c7a2ddea69db53de35.jpg) Mirrors - a camera and a render material The region also has two mirrors, one in the entrance hall and one in the main store room. Details on how to create a mirror: 1. \- In your hierarchy, right click and select 3D Object and plane to create a new plane in your scene view. Then position your plane to face where you want it to be. 2. \- Right click in your project and make a Render Texture. 3. \- In your hierarchy, right click on the plane you just made and add a camera. 4. \- In your inspector, remove the audio listener by right clicking over that module and selecting Remove Component. 5. \- Rotate your camera to face out from the front of the mirror plane. 6. \- Drag the render texture into the Target Texture block of your mirror's camera. 7. \- Drag that same Render Texture you made into the plane you made in hierarchy. 8. \- Set scale on the plane x value to -1 9. \- Switch the shader on the Plan you made to Self-Illumin/Transparent/Diffuse(HDR) 10. \- Set the shader's Emission Gain to 0.1 11. \- Click on the white in the Main Color area at the top of the shader and adjust the A (alpha) slider towards the bottom to adjust the transparency if needed for use in something like a window It is worth noting that mirrors like these have almost no performance impact; Big mirrors like these will not cause lag in your regions. ![Mirror.jpg](/assets/images/mirror-3d6fe7134365b3ebceb85b06a60b7e0d.jpg) Lighting - using different light types The lighting in this scene is described in more detail in our [Lighting an Interior](/sinespace-sdk/regions/lighting-an-interior.md). The different types of lights in this scene are; * Ambient light * Area lights * Point lights * Emissive surfaces ![Lightprobe.jpg](/assets/images/lightprobe-d11811da5c530a047361faab0d008bdd.jpg) Baking - using realtime and baked lights Once all the lights and reflection probes are laid out, if you are baking anything (instead of using realtime lighting for everything) Baked lights have their impact on textures and light probes applied during a one click bake process in Unity before you upload your region. The actual light source is then not used inworld. This improves inworld performance; your frame rate will be higher; but it increases the size of the download by creating lightmaps; large textures that blend with the scene textures to deliver the impact of the original light source. Realtime lights are physical lights operating in your scene. They can cast live shadows on moving objects in your scene. Lots of lights may have an impact on performance but they reduce the size of the region when it is downloaded by your visitors. * [Reflection Probes](https://docs.unity3d.com/Manual/ReflectionProbes.html) Reflection probes - bringing shiny surfaces to life Reflection probes influence all the static and moving shiny surfaces in the scene. That includes the glass shelves and metal lights in this scene, and any metallic or shiny surfaces worn by visitors. Once laid out reflections probes can be baked into the scene like light probes. ![Reflecctionprobes.jpg](/assets/images/reflecctionprobes-3902a6c00ee784f276fec82de13cb75c.jpg) Sliding doors - animating objects without scripting * [Animated Doors](/sinespace-sdk/creating-items/making-animated-doors.md) space creators can easily keyframe animate a huge variety of attributes of inworld objects; not just position and rotation but colour, light intensity, etc. In this scene the doors have been designed to open and close in response to a proximity trigger. No scripting is needed to build interactive components like this. ##### Vending machines[​](#vending-machines "Direct link to Vending machines") * [Inventory Vendor](/curator-dashboard/items/inventoryvendor.md) * [Catalog Vendor](/sinespace-sdk/components/catalog-vendor.md) * [Animated Vendor](/sinespace-sdk/components/animation-vendor.md) The Mirage demo scene contains two types of vending machine; * Catalogue – displays all virtual goods with a specific brand name that you define * Preview – Displays a specific product in preview window ![Vendingmachinemirage.jpg](/assets/images/vendingmachinemirage-2299d3822608c3345849b3bc0e0adcd9.jpg) NPCs - creating mannequins without scripting * [Statue Component](/sinespace-sdk/components/statue.md) The Mirage demo scene contains three NPCs, each dressed wearing a skin that is also on sale in the store. ![Npcs.jpg](/assets/images/npcs-aa3028f5c492564739c98db07fa7830c.jpg) ##### Virtual goods[​](#virtual-goods "Direct link to Virtual goods") * [Video tutorial](/sinespace-sdk/components/virtual-goods.md) * [Virtual Goods](/sinespace-sdk/components/virtual-goods.md) Whatever products you are selling, from whole regions to clothes, accessories, furniture or gestures, all you need to do is add the virtual good component to each asset and upload it to the store. ![Virtualgoods.jpg](/assets/images/virtualgoods-b9f360641154fc47fe706c551fa19ff7.jpg) --- ### Creating Menus for Interactive Objects #### Overview[​](#overview "Direct link to Overview") This article walks through building a menu or 'HUD' for an interactive, scripted object in Sinespace. #### Introduction[​](#introduction "Direct link to Introduction") This article describes how to create menus or 'HUDs' for interactive objects in SineSpace. This article depends heavily on previous work from Mike (CNDG), published in the SineSpace Forum HowTos, and with foundational work supported greatly by Torgon Woodget, Xulain, Trilo Byte, and the unstoppable Adam Frisby. #### Let's get busy[​](#lets-get-busy "Direct link to Let's get busy") There are a few conditions upon which any such HUD project would be predicated. Mainly, that the HUD interface described in this article is specifically for use with scripted objects. There are also some simple circumstances where the HUD could be wired up to certain components, or certain predefined operations. We will employ such operations to the ends of managing the HUD, but our primary focus will be the slightly more complex case of driving scripted operations. This should provide a good survey of the use of the UI for creating HUDs of various sorts. The other condition, of course, is that you have some object to which to attach your scripts and interface. For our purposes, we'll use a *Unity Primitive* of the type *Cube*. To create the cube, use the menu click path *Game Object->3D Object->Cube*. In this article, we'll reference all Unity Editor menu operations in this fashion. The HUD we will develop in this article is a non-modal screen overlay with a background and a few buttons. The buttons will invoke certain functions within the accompanying script. The HUD will be invoked by clicking on the object proper, and will be dismissed with one of the buttons, styled as a classical 'Close' button. This type of HUD is very versatile and can be adapted to a considerable set of interactive objects. It's ideal for a certain class of objects, in that it appears only as a result of manual interaction with the object, and uses no valuable screen real-estate when not in operation. I've used this type of HUD to great effect in my 'Nuklear Radio', which can be found in the SineSpace marketplace (\).
#### Setting up the object[​](#setting-up-the-object "Direct link to Setting up the object") The entire object is organized under an Empty Game Object, so create one in your scene, position it conveniently, and give it an appropriate name. Various components and at least one object will be involved. Firstly, lets get the object out of the way: add it as a child to the Empty Object just created in the scene, and adjust the object's relative position accordingly. For purposes of the article, the object will be the cube created earlier. Next, add the 'Scripting Runtime Component'. This is where the Lua script lives that implements the HUD functionality. \- After selecting it, add a *Canvas* to the now not-so-empty game object we created at the beginning. Henceforth, we will refer to that foundational game object simply as *GO*. (Game Object->UI->Canvas) \- To the new canvas, add an *Image*. While we won't be doing so in the tutorial, this is where the opportunity resides to 'dress up' the UI with a background illustration. Note also that we are passing over some significant detail here in this process; there are various things which must be done to properly size and position the HUD; those are properties of the image, and potentially the canvas. For our purposes, the canvas goes untouched. (Game Object->UI->Image) \- To the image, we will add some buttons. Specifically, three of them: 'Red Alert', 'All Clear', and 'X' (our classical close button)'. Go ahead and create three buttons. Be sure they are all children of the UI image created in the previous step. Edit the position relative to the image, and labeling of the buttons accordingly. (Game Object->UI->Button) You should end up with something similar to this: Your buttons should resemble this in the inspector: #### Wiring up the UI[​](#wiring-up-the-ui "Direct link to Wiring up the UI") Management of the UI is accomplished with two clicks; one is the click on the object to invoke the HUD, and the other is the button used to close the HUD. While the object itself is not a button in the UI, it will be treated essentially as if it were, once we have added a *Clickable Activator* component. Go ahead and do that now. Click on the GO and then in the inspector, 'Add Component'. This should work all more or less as you would expect.
A note about the general unity strategy for exposing screen overlays like this HUD: they are set up and then disabled by default. This allows them to be toggled via some stimulus. The *Clickable Activator* added in the previous step will provide the stimulus to enable the HUD in our application, and the 'Close' button will provide the stimulus to close it.
In the inspector, the *Clickable Event* for the activator should be set to 'canvas.enabled'. Before the proper click path becomes available, you will first need to slot the canvas in the clickable activator. You can set a tooltip value here as well, though it isn't required. The other necessity is the state to which 'canvas.enabled' should be set; it is indicated by the presence or absence of a check in the (unlabeled) checkbox. For the object's click event, we want this enabled status set 'on', so a check goes in the box. Make sure that the UI *Canvas* is slotted in the event's 'target' object, noting that yours most likely *wont* be called 'RadioUICanvas'. None of the other options in the clickable activator component are required. The completed component should look about like this: Now to the close button. Apart from a large set of parameters concerning the button's appearance, it has an 'event' setup, just like that on the clickable activator component. It should be set up identically, except in this event, the status for the canvas.enabled handler operation should be set to 'disabled', so no checkmark in the box. It too should have the UI *Canvas* slotted in the event's 'target' object. It should look about like this:
Now to wire up the other two buttons, we need a script. It's important that we have a few addressable functions exposed by the script that we can tie into the events on the buttons, like we did for the object and the 'close' button. We're not going to get into too much depth about lua scripting beyond cutting and pasting a very simple script into the script window of the *Scripting Runtime Component*. This script will be simple enough such that it's fairly obvious what it's doing, and easily over-explained for purposes of this article ;) If you haven't already, add a *Scripting Runtime* component to your original GO, by selecting the GO and using the *Add Component* button. Here's the script: ```text function redAlert() Space.Log("Red Alert! All Hands!! Man your Battle Stations!") end function allClear() Space.Log("All clear. All Hands, At Ease.") end ``` The forgoing script should be copied and pasted into the *Scripting Runtime* component attached to the GO. You will perforce want to slot the GO into the events tied to each of the buttons. *This is so that the system 'knows' to use a scripting runtime context in the event operations dropdown, and where to look for requested functions.* Now we will set up the buttons. Select the 'RedAlert' button, and find it's event block. Add an event. Note that if you set all these events 'Editor and Runtime' you will be able to experiment with this technique directly in the Unity Editor. In the new event for the button (dont forget to slot the GO!) select 'scripting.runtime' from the dropdown, and in the text field opposite the target object slot, enter 'redAlert'. Note that while this *is* in fact a function reference, you *should not* provide an empty argument list \[i.e., '()']. The function label should be completely bare. Repeat this process for the AllClear button. in the text box, enter 'allClear' instead of 'redAlert'. Save your work ;) If you click the preview button in the editor, you should be able to click the cube, get the menu, and issue red alerts and all clears to your heart's delight. As you may be able to tell from the simple script, these do nothing but write to the system log. In editor mode, you will only be able to see notifications of new chats, not the chats themselves; for that you will have to switch to the console window. #### In conclusion[​](#in-conclusion "Direct link to In conclusion") This should give you a fairly good overview of making object-bound huds for SineSpace. If you have questions, feel free to hit me up on the developer channel. I'm generally around :D
--- ### Making Animated Doors #### Overview[​](#overview "Direct link to Overview") We'll be updating both the doors themselves and the wiki as needed. We'll be updating both the doors themselves and the wiki as needed. Doors could be said to be *complex game objects*. They are structured collections of GameObjects and Components, and how they are assembled and "wired up" is essential to their operation. They will typically consist of some sort of framing in which the door proper and possibly a hinge sits, and the door, which may be a single mesh or in the case of the swinging door, an empty GameObject "hinge" to which the door mesh is a child. Additionally, the various GameObjects will have certain components associated with them, typically to facilitate user interaction and to animate the GameObject. Setting up doors can be a bit tricky, but creating content for Unity is not for the faint of heart. Hopefully, with this tutorial we can make that workflow somewhat less painful for Sinespace creators. Level: * Beginner Unity/Sinespace, intermediate experienced with animation and game level design Goals: * Learn your way around Unity with Sinespace editor extensions * Learn about the animation system and collision triggers * Reproduce three different self contained game object doors Note that the first tutorial walks the content maker through very detailed workflows in order to acclimate the user to the tools and processes by which the game object is created. The remaining tutorials will not seek this depth of instruction, but rather will refer back to the first. Therefor, it's fairly important you should build at least the first door in order to grasp the fundamentals that will be somewhat bypassed in the tutorials for the remaining two doors. If you are an experienced Unity user who is using this wiki article as a reference, feel free to skip ahead or around as needed, and god love you and help you :) ###### The Sliding Door[​](#the-sliding-door "Direct link to The Sliding Door") The *Single Panel Sliding Door* is perhaps the simplest possible articulated door. Before we get into a step-by-step walk-through of it's construction, lets break it down conceptually from the top level. Firstly, there are three requirements of any door: * it must be somehow attached or stationary relative to some enclosure * it must provide ingress to the enclosure to which it is attached * similarly, it must provide egress from the enclosure to which it is attached Given these requirements, we could say that we will need a structure for the door frame, of arbitrary complexity, and a structure for the door proper, of equally arbitrary complexity. For this door, our doorframe will be fairly complex, consisting of a transom piece, a threshold piece, and left and right door posts. The door will be a single cube mesh of appropriate size and proportions to fit suitably within the frame. To get started, create a new project for space, or perhaps use one that you have available for experimentation and development. Use the *Main Menu* to create the first of the cubes we'll use (*Main Menu: GameObject->3D Object->Cube*). Just under the left side of the main menu, click the button to expose the scaling tools. Scale the cube a bit higher than the head of the avatar you would use to walk through the door, and then a little wider than that avatar; on the remaining axis, make it proportionately thick. *** | ![Space-1-panel-sliding-door-tutorial-01.png](/assets/images/space-1-panel-sliding-door-tutorial-01-6f526881e89f10d7a9b1319d3b1e6e98.png) | | ----------------------------------------------------------------------------------------------------------------------------------------- | | | | *Fig. 1: Sizing the door* | *** Next duplicate this cube. Be sure it is selected, as in the image above, then on the object in the hierarchy, *right click->Duplicate*. Now switch to the translation tool, and move the copy along the X axis until it is clear of the door. Switch back to the scaling tool, and edit the thickness in each horizontal direction to form the left door post. Duplicate this one just as you did the door previously, and using the translate tool, move it to the right of the door. Perform similar operations for one each of a transom (above the door) and a threshold (below the door). It should look something similar to the image below: *** | ![Space-1-panel-sliding-door-tutorial-02.png](/assets/images/space-1-panel-sliding-door-tutorial-02-eaac54082df92948a87117b99cc28769.png) | | ----------------------------------------------------------------------------------------------------------------------------------------- | | | | *Fig. 2: The completed door frame* | *** Now, we can't very well just fling down a couple of cube meshes and expect it to behave as a door; and we really need to start organizing things as a unit. This will be important structurally. Note also that the door's 'frame' is not as simple as it could be; it really just needs to be any rigid body mesh; in actuality, it doesn't have to be that even; it could simply be an empty game object, as in the next tutorial. The one constraint is that animation of the door will occur relative to this piece; it can be as simple or as elaborate as you like. I'd perhaps stop short of making it the bulk of a building's construction. So first, lets rename those cubes. Let's make sure to get the names right, recognizing them will be important a little later in the process. Additionally, some structure will be important. Within the hierarchy window, create an empty GameObject (*RightClick Hierarchy Window->Create Empty*). Drag all the door and door frame pieces and drop them on the empty GameObject; then (again, in the hierarchy window) rename the game object something like 'SinglePanelSliding Door'. It should resemble the following image; no changes should occur in the geometry of your construction; only the logical structure in the hierachy window. Should your door objects be oddly nested, just drag them all out and nest them as shown in the image below. *** | ![Space-1-panel-sliding-door-tutorial-03.png](/assets/images/space-1-panel-sliding-door-tutorial-03-918b309d97f107a1629a64eb5b668d44.png) | | ----------------------------------------------------------------------------------------------------------------------------------------- | | | | *Fig. 3: The logical structure of the door, highlighted in the Hierarchy view* | *** This structure is actually very important, if not elaborate. We're working with the simplest possible door, so the structure is the simplest possible; but rest assured that it is crucial to the operation of the door. Before we move on to the next thing, there's one last thing we need to do to each of the elements of the door frame: make them rigid bodies. This is accomplished by adding the 'Rigid Body' script component to the inspector pane when the object is selected in the hierarchy. Once this is added, uncheck 'Use Gravity' and check 'Is Kinematic'. Now we can begin adding the components to the structure that facillitate it's operation. First select the container GameObject created and renamed in the last step. Then click the large 'Add Component' button at the bottom of the inspector pane in the Unity interface. In the search field at the top of the window that appears, type 'Animator'. Click on the Animator component that appears as a search result, adding the component. Repeat once for each of 'Box Collider' and 'Proximity Activator'. Lastly (for this step), resize the box colider as shown in the following image. Editing the box collider is initiated by clicking the icon labelled 'Edit Collider' in the inspector pane. Editing the colliders uses a slightly different interface than other unity editing widgets. There are small dots in the face center of each of the collider's faces; these are handles for translating the face along it's perpendicular axis. This is the only type of editing operation to which a box collider can be subjected. *** | ![Space-1-panel-sliding-door-tutorial-04.png](/assets/images/space-1-panel-sliding-door-tutorial-04-9c52231188c7c101f7c11ac871a86013.png) | | ----------------------------------------------------------------------------------------------------------------------------------------- | | | | *Fig. 4: The Box Collider* | *** Next, in the inspector tab for the box collider, click the box for 'Is Trigger'. This will turn off collisions in a physics simulation sense, and enable the collider to behave as a sensor that triggers it's associated Proximity Activator. The Proximity Activator script multiplexes various signals to the animations defined in the *Animation Controller* configured within the Animator component. In our construct, these signals take the form of strings that are sent up as a result of the occurance of the events 'Activate' and 'Deactivate'. Multiple reactions to each of these two events may be configured in the inspector using the '+' button. They can also be removed with the '-' button. At this point, it would probably be a good idea to create a folder in your project to contain the various elements of the animation. But you already did that probably :) If not, do that now, and get into the folder. Right click the emptiness, and *Create->Animation Controller*. Double clicking the object in the folder (the Animation Controller) will allow you to begin editing the component. Before you do though, be aware we still don't have animation(s) created for the door, so what you see there will neccessarily reflect that degree of completion of the door's construction. The animation controller is what is referred to as a *State Machine*. It is often misidentified as a *Finite State Machine* or *FSM*. It does not meet the requirement, however, as the state machine will exist in multiple states during transitions between states. It is configured with an interface called a *Node Editor*. More on that in a few minutes. When you've finished fiddling with the Animation Controller (hopefully you didn't change stuff substantially), make sure you have the top-level door game object selected, and press 'Ctrl 6' on your keyboard (FYI you can also open the animation window for the selected object from the *Windows* menu on the *Main Menu*). This will open the animation editor. The animation editor is a scene graph editor. *Almost anything* can be animated in unity. If you can click on it in the hierarchy and see modifiable properties in the inspector pane, chances are it is possible to use a scene graph to generate values for that property over the course of time, producing an animation of that property. We will be using the scene graph editor to create three scene graphs: 1. the door in it's inactive state; essentially empty from an animation perspective. 2. The door transitioning from it's idle, *closed* state to an *open* state. and finally 3. The door transitioning from it's *open* state to it's *closed* state. These animations will form the basis for what happens once the collider triggers the proximity activator sending up the appropriate signals to the animation controller via the animator component. Starting to get the picture here? don't worry, if it hasn't already, it will start to come together soon. Following is a screenshot of the unity editor with the animation controller exposed in the node editor interface, as it looks without our animations in the object's context: *** | ![Space-1-panel-sliding-door-tutorial-05.png](/assets/images/space-1-panel-sliding-door-tutorial-05-454ed072c2cd7366e6b48612219b5f00.png) | | ----------------------------------------------------------------------------------------------------------------------------------------- | | | | *Fig 5: An early peek at the animation controller state machine within the node editor.* | *** If your animation editor is not already open and displaying a button center-window labled 'Create', then select the top-level door game object in your hierarchy, and press 'Ctrl 6' on your keyboard. Then click that 'Create' button. This will open a system file browser and prompt you for a new name for the *clip* as they are called within the context of the scene graph editor. Give it a unique and descriptive name; this will be the first of the three previously mentioned animations (Idle or 'closed'). When this is done, you will see the animation's name displayed on the scene graph editor's window/tab at the far left of the second row (toolbar). This is a drop down list, with the final item on the list always being 'Create New Clip...'. Go ahead and create all three and make sure they appear on the drop down list as shown in the image that follows: *** | ![Space-1-panel-sliding-door-tutorial-06.png](/assets/images/space-1-panel-sliding-door-tutorial-06-0ef5cc462617679de57dde610bd17f55.png) | | ----------------------------------------------------------------------------------------------------------------------------------------- | | | | *Fig. 6: Setting up the animation clips.* | *** Select the clip for 'open' in the dropdown list, and click the 'Add Property' button. What this is going to do is instantiate a *picker* containing a tree of all the object properties who's values may be varied by scene graph. This picker structures the items into the tree based on the container hierarchy reflected in the folder-like organization in the hierarchy view. This is how that structure begins to impact the context of of the object vs it's animated properties. The property you'll want to add will be *Door->Transform->Position*. If your door is named something other than 'Door', then you'll want to pick your door name out of the picker tree instead. To finally add the property to you clip, click the little '+' to the right of the property you're adding. It should look a lot like this: *** | ![Space-1-panel-sliding-door-tutorial-07.png](/assets/images/space-1-panel-sliding-door-tutorial-07-a8aeba56327594279de1dae09cccfbef.png) | | ----------------------------------------------------------------------------------------------------------------------------------------- | | | | *Fig. 7: Adding properties to a clip so their scene graphs can be manipulated.* | *** Having clicked the little plus, you'll now have a position property above the 'Add Property' button. Click the switch triangle to it's left to open it. You'll now see the scene graphs for each of the three properties of the position: X, Y, and Z. We'll be animating the 'X' property. On the time scale across the top of the scene graph opposite the properties, click about two thirds right on the scale. This should set the time cursor forwards about 2/3 the way through the scene graph. Next, right-click on the intersection between the X axis on the scene graph (horizontal, top property of the position), and the time cursor you just set. Select 'add keyframe' from the popup menu this click generates. You'll see a screen greatly resembling this: *** | ![Space-1-panel-sliding-door-tutorial-08.png](/assets/images/space-1-panel-sliding-door-tutorial-08-cb4bc90d6e4049e5924d99c91bf0f76e.png) | | ----------------------------------------------------------------------------------------------------------------------------------------- | | | | *Fig. 8: Setting up Keyframes*. | *** Now click on the diamond that appeared on the scene timeline. This is your keyframe. You should also notice to the right of the property label back on the left side of the screen, a number. Click it. Select the number and copy it with 'Ctrl-C'. Change it from '0' to '1'. If yours has a different number, say, 6.73, make it 7.73, or perhaps 5.73 if you'd like to have the door slide to the other side. If you have rotated your door to some arbitrary rotation, you're going to have problems moving forward with this tutorial; but don't be concerned, there are straightforward methods for doing that, we're just not going there at this time. So, if you switch to your 'Scene' view, you'll see very something like this: *** | ![Space-1-panel-sliding-door-tutorial-09.png](/assets/images/space-1-panel-sliding-door-tutorial-09-18c44b760b1fddcad21db390e86ff5d5.png) | | ----------------------------------------------------------------------------------------------------------------------------------------- | | | | *Fig. 9: The scene view, with the scene graph cursor in the animation editor positioned on the final frame of the 'Open' animation.* | *** If you haven't yet, switch back to the 'Animation' view. Don't confuse it with the 'Animator' view. Now on the dropdown list just above the properties tree for the door, select your 'close' clip. We've yet to fiddle with this one, so we repeat the process starting with adding a position property for the door (hint: it's a *Transform*). Next add a keyframe by right-clicking the intersection between the 'X' positional property and somewhere around 40 frames into the scene graph timeline. Finally, select the last diamond at the intersection of the scene graph and the 'X' property axis (it's the first frame). Now back on the left hand side where the numbers are, click whatever number is there and replace it with the one you copied earlier (Ctrl-V or Shift-Ins). You should have something approximating this: *** | ![Space-1-panel-sliding-door-tutorial-10.png](/assets/images/space-1-panel-sliding-door-tutorial-10-a8c3a7036bd469a51b649c36d86cdb60.png) | | ----------------------------------------------------------------------------------------------------------------------------------------- | | | | *Fig. 10: Setting the initial value for a property in the animation editor.* | *** Additionally, if you have a peek at your scene view, you will see that the door has closed again. That's a good thing (tm). Don't forget, we've been working in the 'Animation' view, not the 'Animator' view. That's about to change, though. A quick note on authoring animations in Unity: be *very* careful that your animations are doing what you think they are. An animation with an 'off' keyframe can make everything look faulty, even when it's actually otherwise perfect. Additionally, if you can at all, run the unity editor on two monitors. It will save you no end of headache, as you can actually get everything on the screen and open at once so as to be able to tell with absolute precision what your animations are doing, and what is transpiring in your state machine, vs what is happening in the scene. This made the difference in struggling to find a problem all afternoon and recognizing it within a few mins for me at the time that I wrote this tutorial. Note also that the numbers showin in the scene graphs likely reflect some of the animation errors I made when making the tutorial, and should not be trusted. Before operating your door, be sure to drag the scene graph cursor down the timeline of your animation clip, and watch it in the scene view to insure it is doing exactly what you would have it do. One last thing before diving into the 'Anitmator' view: locate the animations you've recently created, specifically the 'Open' and 'Close' animations. Uncheck the 'Loop Time' setting. This will keep them from firing repeatedly. Next locate the 'Idle' animation, and insure that 'Loop Time' *is* checked in the inspector interface. If you switch to your animator view, you will see something quite interesting. The view of our animation controller has changed dramatically. This is because it is contextually aware of what we're doing. This is not miraculous, but it is pretty decent engineering. The makers of unity understood that we were going to establish a relationship between animations and arbitrary *states* in a *State Machine*, and added those to our animation controller view. It also arranged them logically for us, though we will need to insure that the proper conditions are met to permit or preclude transitions between states. Here's a view of the state machine in the node editor for the animation controller: *** | ![Space-1-panel-sliding-door-tutorial-11.png](/assets/images/space-1-panel-sliding-door-tutorial-11-54376c15a4b549a54214d7bfa20d8eec.png) | | ----------------------------------------------------------------------------------------------------------------------------------------- | | | | *Fig. 11: The node editor with the animation controller state machine loaded.* | *** It's worth taking a moment to go a little more in-depth with respect to the *Node Editor*. Examining the state machine, we can see it is a sort of flowchart. However, not all of the salient information about the state machine is present in this graphic representation; only the structure, as presented by an ordered set of colored and labeled icons positioned on a grid. Three types of these icons are present in our view in the previous image ('Any State', 'Entry' and 'Exit'), and are *terminal* (in the literal sense), meaning that they describe entry/end points for the state machine. 'Any State' can be wired up to a state that can be entered at any time; and 'Entry' and 'Exit' are fairly self explanatory; in our animation, we never want the state machine to exit, and to only be entered according to signals from the proximity activator so these two are not wired up. Additionally, there is one of the states that is orange: this is the default state. It is just that, and 'Entry' is always wired to it unconditionally with a transition that cannot be previewed or modified. Any otherwise mundane state can be made the default state using a pop-up menu that appears with a right-click on it's icon. The wiring, or arrows in the view, indicate the direction of state transitions explicitly; but there are also a potential set of conditions that must be met in order for the transition to occur. The interface for setting these appears in the inspector when one clicks on the transition icon (arrow). One last thing about this node editor: if you have it open when playing back animation clips associated with the controller that's loaded into it, it animates and indicates the state it's presently in, active transitions as they occur, and progress through the clip indicated in the state. This can be indispensible when troubleshooting animated objects. Note the sort of clockwise flow between the states associated with our three animation clips. This is because it is only possible to reach one of these states having arrived at the one prior to it in the cycle. One does not go from an idle state to a door closing state; that is not logical. One only closes a door that is open. What we must do next is to configure the state machine such that it only opens the door when signaled to do so, and only closes it after it has been opened. This is done by setting conditions in the transitions represented by the connecting arrows. We can't do that just yet though, first we have to declare the functions in the proximity activator that are sent up as a result of the collider events. Unity has already predefined the signals for us in the state machine. To the left of the node editor interface, you's see a *parameters* tab open on top. The two parameters given are the signals, 'Open' and 'Close'. The functions are to be declared in the inspector, with the Proximity Activator exposed in the interface. At the bottom of the Proximity Activator pane in the inspector, see the *Events* block. There are two events, we examined briefly when we added the component; these are *Activate* and *Deactivate*. Now, what we want to happen under either of these conditions is for a string to be sent up to the animation controller that matches a parameter there. This is accomplished with the *animator.SetTrigger()* function. This function will send up whatever string is passed to it to the Animation Controller. We want to set this funtion on both events, but each invocation with appropriate string value. These functions are added and configured in the interface by clicking the '+' sign near the event in the interface, and the resulting configuration options for the event filled from the picker in the popup. What you ultimately arrive at should be something a bit like this: *** | ![Space-1-panel-sliding-door-tutorial-12.png](/assets/images/space-1-panel-sliding-door-tutorial-12-286931b04d22979db34fee2b62c67391.png) | | ----------------------------------------------------------------------------------------------------------------------------------------- | | | | *Fig. 12: Tieing the Gameobject back to the Proximity Activator.* | *** Now we should be ready to set conditions on the transitions in the Animation Controller's state machine. Switch to the Animator view, and in the node editor click on the transition arrow between the 'idle' state and the 'open' state. The names are just descriptive, but they should be recognizable in the interface. In the inspector, you should now see the properties for the transition. The important thing is that the right states are associated with the correct animations, and that the transitions occur in a logical fashion. The control of the transitions is through *conditions* set in the inspector with the transition selected: *** | ![Space-1-panel-sliding-door-tutorial-13.png](/assets/images/space-1-panel-sliding-door-tutorial-13-fc455c6ebbb9e3026344e935ee626983.png) | | ----------------------------------------------------------------------------------------------------------------------------------------- | | | | *Fig. 13: A look at the properties of a transition in the node editor.* | *** Take a peek at the 'Conditions' pane in the inspector: notice that it specifies 'Open' as a condition for the transition from the 'Idle' state to the 'Open' state. This is because we open the door as soon as the controller is activated by the proximity activator. The next transition in the flow has a condition set for 'Close', which is only ever activated when the proximity activator is deactivated. The final transition in states, from 'Close' back to 'Idle', happens without conditions. Configure yours as such and you should be ready to preview your door in the editor's 'play' mode. --- ### Recipes #### Overview[​](#overview "Direct link to Overview") Recipes are a special type of item upload that exchange input item IDs for one output item ID, or for one weighted random output from a list. A recipe can only produce one output. If multiple output IDs are provided, Sinespace picks a random item from the list, weighted by the `weight` field. The user must have the desired input items in their inventory. These items are destroyed when the recipe is executed. If no input items are specified, the recipe gives out a random item from the output list. Recipes can be used for: * Quests where parts of a whole object are collected and transmuted into the finished product. * Treasure hunts and other activities where random rewards are desired. * Lucky Dip sales, such as buying raffle tickets that return random items. note Recipes must be approved by Sine Wave. Open a support ticket if you want to set one up. Output items may be split across many creators with the consent of all parties. --- ### Spawnable Objects: Uploading and Spawning Objects #### Overview[​](#overview "Direct link to Overview") Creating spawnable objects for Space is very different from creating objects for more simulation-oriented platforms, where such construction activity occurs *in-situ*. As Unity's method of distinguishing and storing scene elements is the *Prefab*, as in other application areas, Space picks up the concept and extends it to our use case. #### Creating the object[​](#creating-the-object "Direct link to Creating the object") First the object to be used as a Space rezzable is created in Unity. The Space Editor Pack must be imported and installed; prior to uploading, the creator must be logged in to the Space creator servers. Once the object's construction has been completed, drag it from the heirarchy back into the project folder where you can find it. Attach the *Virtual Good (virtual good) Script* component to the prefab of your object. Examining the Virtual Good (virtual good) Script component in the inspector, fill in the minimum fields: Name, Brand, Developer Name and Category. Set the *Content Type* for object type to 'Generic'. #### Uploading the object[​](#uploading-the-object "Direct link to Uploading the object") Click the *Automatic Submission* button at the bottom of the script's property pane (you might need to scroll the inspector to see it). This will initiate the item upload, which, you will find, goes a lot more quickly than a region upload. Once it completes, you will find the item in your Space avatar's inventory. #### Spawning the object in-world[​](#spawning-the-object-in-world "Direct link to Spawning the object in-world") Once you've logged into Space with a web browser or Space desktop client, you will find the object in the avatar's inventory. You can either click it and add it to your hotbar (dragging to the hotbar works too, but be careful you don't over-write something already there), where it can be clicked for quick spawning, or alternatively, drag the item from your inventory onto the ground. You can delete the item from your inventory once you have placed it in world. --- ### Adding Poses to Furniture #### Overview[​](#overview "Direct link to Overview") You can add poses to furniture to make the item sittable. You can add poses to furniture to make the item sittable. This will add a blue arrow icon to the piece of furniture, which a user can click on and then the avatar will sit on the furniture in the pose/animation you have added to it.
##### SeatImproved Component[​](#seatimproved-component "Direct link to SeatImproved Component") Once you have the piece of furniture in the scene, click on the furniture item in the hierarchy, then click Create and choose Create Empty Child. ![](/assets/images/300px-createemptychild-76d9a093a3c1c65ab946e36d2a5c391f.png) You can rename this to 'Pose' or 'Seat' to make it easier. Making a child for this is so you can move the pose independently from the main furniture mesh to help position the avatar correctly once animation is added. With the child/Pose highlighted, click on Add Component in the Inspector window and search for Seat Improved. When you have added the Seat Improved component, you will see a green box show up on your furniture item and also see the Seat Improved script settings in the Inspector Window. ![](/assets/images/seatscript-d62d26b69e4a70d5733532b05ec1ecd8.png) Under the Seat Improved script, you will see a few options. * Animation * Gender-Specific Overrides * Action Tag (Optional) * Network Adjustments * Events * IK Targetting ###### Animation[​](#animation "Direct link to Animation") This is the slot for the animation clip you want the chair to play when an avatar sits here. You can have a static animation or a dynamic animation. ###### Gender-Specific Overrides[​](#gender-specific-overrides "Direct link to Gender-Specific Overrides") These will override the animation clip you have placed in the Animation slot with a gender specific animation. There is a slot for male animation, female animation and also a slot for NPC. The NPC override will make the animation static. ###### Action Tag[​](#action-tag "Direct link to Action Tag") These are optional settings to change the location of the action tag. You can override the location here and also add a collider to hide the tag. Note: You won't be able to see the tag in Unity. You will have to check the tag position by uploading the furniture to staging and testing it on the preview server. ###### Network Adjustments[​](#network-adjustments "Direct link to Network Adjustments") If you are placing your SeatImproved component on something that moves, e.g. a swinging chair, you will need to check the Slot ID box, and then add in a Seat Slot ID number. You can choose any number you like as long as it is unique, for example something like 403. ![](/assets/images/seatslot-5d875678d9358b6c6eb47ecb6e31e131.png) ###### Events[​](#events "Direct link to Events") These are optional settings where you can set up an action to activate or deactivate when the user sits down or stands up. ![](/assets/images/events-bd23d0428f1969f0cf493c52bfc5ad03.png) The top two, On Stand Up and On Sit are global, so this means any action will affect all avatars including your own. The bottom two, On Player Stand Up and On Player Sit trigger locally for yourself. This is handy for HUDs, buttons and other such things. In the image above, this local event setting is being used to active the player camera to focus on the browser screen when the user sits, and switch back to normal player camera view when the user stands. ###### IK Targetting[​](#ik-targetting "Direct link to IK Targetting") IK targetting is used to override the default placement of the hands and feet in the animation. This is particularly useful to make sure that the avatars' feet don't go through the floor e.g, if you have placed a chair on a rock and you don't want the avatars' feet to fall through the rock. If you want to use IK targetting, you will need to create an Empty Object. Name it with reference to the IK targetting such as LeftFoot or RightFoot e.t.c Place the empty object at roughly the same height and placement as the avatars' ankle (this will make sure that avatars' of different height don't have their feet going through the floor). Drag this empty object into the Transform box on the IK targetting. ![](/assets/images/iktargetting-0a3f4df0a08093203232ae0d9c2fb6b9.png) You can test the placement by clicking on the 'Play' button at the top of Unity and switch to the 'Game' tab. If the positioning is not correct, you can move the empty object until it is in the right place.
##### Adding the Animation[​](#adding-the-animation "Direct link to Adding the Animation") For this chair, I am going to use the Animation slot as I want this to be used by both genders. Find an animation you want to use for the pose that your avatar will use on the chair. Once you have the animation, click on it in the Project window. It's Import settings will be shown in the Inspector Window. ![](/assets/images/animationimport2-322ccef267e2b3858b343775b67aecc3.jpg) Under the Rig tab, there will be a couple of sub headers: * Animation Type * Avatar Definition * Source The animation type will want to be set to Humanoid. If you are setting the animation up to be used with our default avatars, choose Copy From Another Avatar under the Avatar Definition header. Go to Source and choose the fitting avatar for the animation. If you are using gender specific animations, please select the right gender from the 2015 Female and 2015 Male avatars .fbx files. Click Apply. ![](/assets/images/rigsettings2-0dc4af545445c6b1045f1c7043997a30.jpg)
Go to the Animation tab and scroll down to Motion. You want to set this to None so you can independently move the avatar when playing the animation under the Game tab. Click Apply. ![](/assets/images/animationtab2-d7fcf873d6d9623c705d9c8268b5e1e3.jpg) ##### Testing And Finalizing the Animation[​](#testing-and-finalizing-the-animation "Direct link to Testing And Finalizing the Animation") Once this is done, click on the child of the furniture (Or Pose if you renamed it), and drag the animation into the rightful animation slot under the Inspector Window. Remember to place the specific animations for female and male overrides if this is what you want to do. ![](/assets/images/take2-98cf1cca3b5f9325a6b6e32891e40f0a.jpg) After doing this, you can search for 'PlayerChar' in the search bar of your project window, and drag it into the hierarchy. You will also need to add a Plane mesh if you are using an empty scene as the player-character will fall through the ground of the Unity scene without it. To add a plane, click Create under the hierarchy and go to 3D Object and choose Plane. You will want to place this underneath the furniture you are using. Once this is done, you can click on the Play button at the top of the screen. This will take you to the Game tab, and you will see the Space UI, your avatar and the furniture. When you hover over the furniture, a hand icon will appear. (In-world, this will be a blue arrow action tag). Click on it and your avatar will 'Sit' on the piece of furniture with the animation/pose you have chosen. If the avatar is not in the right position, click on the Scene tab, but do NOT stop the Game. You might have to right click the Game tab to minimize it if it is maximized. Click on the child/pose in the hierarchy. You can move your avatar along with the animation to fit the furniture properly. Once you have moved it, you will see that the new placement is marked under the Transform header in the Inspector window. Right click the Transform header, and choose Copy. This insures you won't lose the correct placement when you stop the Game tab. ![](/assets/images/copytransform1-92f8871f8369b3a1d68f99d12020efb1.png) Stop the Game tab from running by clicking the Play button at the top of the screen. You will see that the Transform position is back to 0,0,0. Right click the Transform header, and choose Paste Component Values. This will add the coordinates you copied to put the animation in the right position. The furniture is now set up with the animation/pose. ##### Uploading the Furniture[​](#uploading-the-furniture "Direct link to Uploading the Furniture") To upload the furniture item with the SeatImproved script, click on the parent object of the furniture item in the hierarchy, for example, a chair with the SeatImproved component on it. In the Inspector Window, click on 'Add Component' and search for 'Room Furniture'. Add this component and set it up. If you need to know how to do this, please see [here](/sinespace-sdk/furniture/how-to-upload-items-as-furniture.md). Once this is set up, you can then add the virtual good component to the furniture item, then drag this from the hierarchy into the project window to make a prefab. When you have made the prefab, click on it, and fill in the virtual good component. For furniture items, the Type must be set to Furniture. The category should be Furniture, then choose the appropriate category. Fill in the rest of the details on the virtual good component, then you can hit the Automatic Submission button under the Upload tab to start the process of uploading to Sinespace. You can check on the progress of your upload at curator.sine.space --- ### How to upload items as furniture #### Overview[​](#overview "Direct link to Overview") \#firstheading You can upload items as furniture items to place in room templates with the 'Edit Room' button. #### [#firstheading](#firstheading)[​](#firstheading "Direct link to firstheading") You can upload items as furniture items to place in room templates with the 'Edit Room' button. These furniture items can be dragged from your inventory and placed in your room. The items don't necessarily have to be furniture such as chairs, and they can be game items (like the Greedy Greedy table in the Welcome Center), a presentation tool or pieces of a structure which users can use to build a larger item (e.g. pieces of a race track). If you want to make the furniture item sittable, you will need to add the SeatImproved component to an empty child object and parent it to the furniture. Here is a [tutorial](/sinespace-sdk/furniture/adding-poses-to-furniture.md) on how to do that. ###### Attaching the Furniture Component[​](#attaching-the-furniture-component "Direct link to Attaching the Furniture Component") 1\. Have the item object you want to upload as a furniture item in your scene in Unity. Once it is in the scene, click on it in the hierarchy. 2\. In the Inspector window, click on 'Add Component', search for Furniture and add the 'Room Furniture' component. ![](/assets/images/600px-roomfurniture-b9eea68a6c0ea5c9049a4ea2ea7e5956.png) 3\. Once added to your object, you can change the settings to best fit what the furniture will be used for. Tick the Place on Floor box for objects such as chairs, sofas e.t.c, tick Place on Walls for things such as paintings and tick Place on Ceiling for things such as ceiling fans. If you are uploading furniture which will be placed on the floor or ceiling, make sure that the Y axis (green arrow) in Unity is facing outwards. If you are uploading furniture which will be placed on walls, make sure that the Z axis (blue arrow) points outwards (away from the wall). 4\. In the Collider section of the Room furniture component, drag in the furniture items main collider. This should be done for all furniture uploads. If your furniture item does not have a collider, you can add a box collider to it by clicking on 'Add Component' and search for 'Box Collider'. You can then adjust the box collider to fit around the item. There is also the option to 'only enable collider during editing'. This should be checked if normally the collider should be disabled, e.g for particles or lights. ![](/assets/images/600px-roomfurncol-e6a47655e690b1f897345161f10bd8be.png) 5\. Next is Transform Controls. In here, you can check the 'Allow Scale' box if you want users to be able to scale the furniture once they place it in their room;if not, leave it as it is. 6\. In Appearance, there is the Icon Position. This is the position of the blue arrow (action tag) which hovers above the furniture for users to click on to enable them to sit on the furniture. ###### Uploading the furniture[​](#uploading-the-furniture "Direct link to Uploading the furniture") 1\. Underneath the Room furniture component in the hierarchy, you will see an 'Add Component' button. Click on this, and search for Virtual Good. Add this. 2\. Once the virtual good component is added, under Basics, set the Type to Furniture then the Category to the appropriate category. ![](/assets/images/600px-furniturebas-5532c1d01576b023b5c53b83664bce27.png) Fill in the rest of the virtual good component with the information for your item and then upload the item to Sinespace. --- ### SeatImproved #### Overview[​](#overview "Direct link to Overview") The seat Improved component is added to any item that you want to enable animation on; specially furniture. The seat Improved component is added to any item that you want to enable animation on; specially furniture. ##### Adding Seat Component[​](#adding-seat-component "Direct link to Adding Seat Component") Create an empty Child in the furniture(To be able to move the animation easily). Add component on child and select Seat improved script. ##### Seat Improved Properties[​](#seat-improved-properties "Direct link to Seat Improved Properties") Animation: You can upload the animation you wish to play here. ![](/assets/images/seat-improved-3d266fecff3fe4fc123fc09a1faee20d.jpg) ##### Gender Specific Overrides[​](#gender-specific-overrides "Direct link to Gender Specific Overrides") This is used to set specific animation for male and female avatars. Animation male : Animation can be specific to Male Avatars only if it is added here. Animation female : Animation can be specific to Female Avatars only if it is added here. NPC : NPC can be placed on the furniture by dragging and dropping the Statue(NPC) in the scene here. To read more on how to create an NPC in scene refer to [Statue](/sinespace-sdk/components/statue.md). ##### Seat Improved video tutorial[​](#seat-improved-video-tutorial "Direct link to Seat Improved video tutorial") To know more about seat improved watch the tutorial shown [here](https://www.youtube.com/watch?v=Hw0mjkaLs7Y\&index=18\&list=PL3MZuSlVM0J9c42EyQuOWzl6F_ZEfHWAM%7C) --- ### Guns and gun givers #### Overview[​](#overview "Direct link to Overview") FPS Components Shooter games FPS The safe zone lobby Player spawn points Health and ammo givers Traps King of the hill zone Enemy NPCs and NPC spawners The gun The gun system is a raycasting gun. ###### FPS Components[​](#fps-components "Direct link to FPS Components") [Shooter games FPS](/sinespace-sdk/games/shooter-games-fps.md) [The safe zone lobby](/sinespace-sdk/games/the-safe-zone-lobby.md) [Player spawn points](/sinespace-sdk/games/player-spawn-points.md) [Health and ammo givers](/sinespace-sdk/games/health-and-ammo-givers.md) [Traps](/sinespace-sdk/games/traps.md) [King of the hill zone](/sinespace-sdk/games/king-of-the-hill-zone.md) [Enemy NPCs and NPC spawners](/sinespace-sdk/components/enemy-npcs-and-npc-spawners.md) ##### The gun[​](#the-gun "Direct link to The gun") The gun system is a raycasting gun. The gun has a muzzle flash and impact event. Players can shoot each other and NPCs. Players can hold up to eight guns in inventory at once. The public variables on the gun include settings for bullet type, fire rate, range and damage. (Upcoming features will include configurable reload speeds, magazines, etc.) Each gun also contains the Animation Override that plays idle, walk, run, damage and death sequences on the player. This video tutorial shows how to configure and publish your own Guns and Gun Givers as inventory items that players can in place in their own customised multi-player maps in Sinespace; [Watch on YouTube](https://youtube.com/watch?v=Lnwkd94yaqk) The gun consists of three versions of the gun barrel (the visible gun). The other unique assets for each gun are; * The muzzle flash * The bullet * The crosshair * The Animation Override 1. Barrels In the Elements folder of the Shooter project there are three gun barrels; * Barrel, * Barrel Mouselook, and * Barrel Remote The Barrel is the version players see in their own hands in third person view. The Barrel Mouseview is the version they see in mouseview, which they get to by zooming in on their mouse wheel. The Barrel Remote is the version other players see. It has less scripts than the player’s own two versions and not use unnecessary resources during gameplay. 1. Public variables There are six public variables; * bulletType * fireRate * range * hitDamageNPC * hitDamagePlayer * showhits * Bullet type\*\* will be referenced in the ammo crates and the gun bar on the Player HUD. We recommend keeping **fire rate** down to a max of 8 bullets per second. (Networked pooling of bullets is in development to support higher fire rates). * The range\*\* defines how far away a target can be and still take damage. * hitDamageNPC\*\* and **hitDamagePlayer** set the damage done by the gun. Guns can be configured to inflict different levels of damage on player or NPC. You can set **showHits** to 0 if you do not want other players to see each other’s shots. (Which is pretty sneaky, frankly.) 1. Resources In the resources you can see we have the **pool bullet**. This is a particle effect for impact. The other resource on the barrel is the **third person animator**. This is the animation override for idle, walk, run, take damage and die while carrying the gun. Notice on the movement blend tree we blend though three sets of the idle. This ensures the player moves to idle pose even if there is marginal movement on the character and prevents it from appearing to be walking on the spot. The damage and death animations can be used to trigger events other than character animations. For instance you can combine the FollowAvatar component with a Cinemachine camera to move to a third person, bird eye view during the death sequence, so players witness themselves dying. Horribly. Any events you animate as part of a death sequence should match the time you set in the deathSequenceDuration public variable on the Combat Meter in the Safe Zone Lobby. Remember you also want this timed with any animated event on the Death canvas in the Killed screenspace canvas. 1. Events The Fire event triggers when the player fires the gun. It can trigger your muzzleflash and any other events, like a recoil animation on the gun (see tutorial video). 1. Object reference The cylinder referenced in the barrel object reference is used to position the gun in the player’s hands. It should be disabled but not deleted when you upload the gun. 1. Grip The grip inside the barrel contains the disabled cylinder referenced above. You can enable this and use it to line up your gun so it fits into the player’s hands. Don’t forget to disable it. Don’t delete it! You need to apply your gun model to all three copies of the barrel. In our experience the mouselook version benefits from being enlarged compared to the others. 1. Barrel mouselook The barrel has all the same settings, scripts and components as the main gun. The Barrel mouselook has a canvas where you can insert a unique crosshair for the gun. ##### Gun giver[​](#gun-giver "Direct link to Gun giver") This is an object in the scene that gives a specific gun type to the player. The template art Gun Giver is configured as a spawnable item which players can place in the map from inventory when laying out a customised map. The Gun Giver can be configured in numerous other ways, for instance to spawn and destroy itself as a child of an NPC, making it possible to grab the gun of a dead NPC. Or it could be configured to give a gun as a reward for completing a side quest (see the side quest video and documentation here and here.) The public variables on the Gun Giver include settings for gun type, bullet type and the number of bullets in the gun when first collected by the player. 1. Public variables There are 5 public variables on the script. * gunType * bulletType * bullets * bulletInterval * order * gunType\*\* is referenced here, in the gun bar and gun changer. Ensure you give each gun a unique name. * bulletType\*\* we give the same naming convention as on the barrels. * bullets\*\* is the number of bullets in the gun when you pick it up. * bulletInterval\*\* is a cooldown rate; the gun giver will also give ammo for the gun. * Order\*\* is where in the gun bar this gun will appear. 1. Resources There are six resources on the Gun Giver; the three gun barrels, the 3rd person animator and the gun icon that appears in the gun bar. Drag your versions in from the project. Do not alter the naming conventions. 1. Trigger activator The trigger activator on the base of the Gun Giver triggers the event giving the gun when the player walks within the collider attached to the object. Note this activator is set to owner only, so I don’t give the gun to everyone in the game at once! --- ### Health and ammo givers #### Overview[​](#overview "Direct link to Overview") FPS Components Shooter games FPS The safe zone lobby Guns and gun givers Player spawn points Traps King of the hill zone Enemy NPCs and NPC spawners The template examples of the He ###### FPS Components[​](#fps-components "Direct link to FPS Components") [Shooter games FPS](/sinespace-sdk/games/shooter-games-fps.md) [The safe zone lobby](/sinespace-sdk/games/the-safe-zone-lobby.md) [Guns and gun givers](/sinespace-sdk/games/guns-and-gun-givers.md) [Player spawn points](/sinespace-sdk/games/player-spawn-points.md) [Traps](/sinespace-sdk/games/traps.md) [King of the hill zone](/sinespace-sdk/games/king-of-the-hill-zone.md) [Enemy NPCs and NPC spawners](/sinespace-sdk/components/enemy-npcs-and-npc-spawners.md) The template examples of the Health Givers are configured as spawnable inventory items that players can place in their maps, adding to the unique challenges they can set for themselves and their friends when they play together. The public variables on the Health Giver and Ammo Giver allow players to define the amount of health or ammo given, bullet type, and the cool down rate on individual items spawned in the map. This video tutorial shows how to configure and publish your own Health and Ammo Givers as inventory items that players can in place in their own customised multi-player maps in Sinespace; [Watch on YouTube](https://youtube.com/watch?v=h-q-id5eaew) 1. Public variables * Health * Interval Health is the amount of health you get each time. Interval is the cool down rate before you can use it again. There are no resources, events or objects. The default art template has a trigger activator triggering the addhealth function when the player passes through the collider. It is set up as a placeable item in the map but you could configure the same component to drop as a one time vial that destroys itself when the player collects. ##### Ammo givers[​](#ammo-givers "Direct link to Ammo givers") Ammo Givers let players collect ammo. Gun Givers also act as Ammo Givers. Individual Ammo Givers are tied to specific bullet types. 1. Public variables The Ammo Givers have three public variables which players can configure when placing the items in their maps. * bulletType * bullets * bulletInterval * bulletType\*\* corresponds with the type defined in the Gun Giver. * bullets\*\* defines the number of bullets the player gets each time they use the Ammo Giver. * bulletInterval\*\* defines the cool down rate on the item. The trigger activator triggers the script to call the bulletCrateTryGive function. This is triggered by walking through the collider which must be set to β€œIs trigger.” --- ### King of the hill zone #### Overview[​](#overview "Direct link to Overview") FPS Components Shooter games FPS The safe zone lobby Guns and gun givers Health and ammo givers Traps Player spawn points Enemy NPCs and NPC spawners The King Of The Hill (KOTH) Zo ###### FPS Components[​](#fps-components "Direct link to FPS Components") [Shooter games FPS](/sinespace-sdk/games/shooter-games-fps.md) [The safe zone lobby](/sinespace-sdk/games/the-safe-zone-lobby.md) [Guns and gun givers](/sinespace-sdk/games/guns-and-gun-givers.md) [Health and ammo givers](/sinespace-sdk/games/health-and-ammo-givers.md) [Traps](/sinespace-sdk/games/traps.md) [Player spawn points](/sinespace-sdk/games/player-spawn-points.md) [Enemy NPCs and NPC spawners](/sinespace-sdk/components/enemy-npcs-and-npc-spawners.md) The King Of The Hill (KOTH) Zone is a spawnable item that players can place in their maps. It is the first in a series of items that will provide a range of different game modes for the FPS system. The KOTH Zone gives players points when they defend it. Successful defence of the KOTH zone is defined as one player or players from one team being within the KOTH zone for a period of time, alone or with no other teams present in the zone. The public variables on the KOTH Zone allow players to define the time required to earn points and the number of points earned. The points are integrated with the leaderboard and round system, deployed in the Safe Zone Lobby, allowing players to define the number of points required to win a round. The KOTH zone supports a number of visible events including a dynamic animation system that will time animations to fit with the point duration defined by the player (e.g. in the tutorial video we show a flag rising up a flag pole. If the players define a point as taking 10 seconds to accrue, the KOTH zone will time the animation of the flag rising to fit with that 10 second time period, resetting the animation if the point is not completed.) This video tutorial shows how to configure and publish your own Health and Ammo Givers as inventory items that players can in place in their own customised multi-player maps in Sinespace; [King of the Hill Zone tutorial](https://www.youtube.com/embed/HoMxzoriq4g) 1. Public variables There are four **public variables** on the KOTH Zone script. * pointInterval * points * team * pointInterval\*\* is the time it takes for a point to be won. * points\*\* is the number of points you get each time. * team\*\* is currently pending; we will support team games on the KOTH zone shortly. 1. References There is one reference; the animator. The animator. The default animator shows a cylinder going from large and green to red and small over the course of one point period. 1. Events You can trigger events for the zone being free, taken (in an all against all mode) or taken by a specific team. 1. Animation Controller Please note the speed is set to 0 and the animation is one second long. Whatever you choose to animate, keep it to 1 second overall. The script then updates the object you are animating in time with the time period defined in the pointInterval public variable; which defaults to 30 seconds but can be configured by the developer or the player setting out the item in their map. 1. Trigger activators There are two trigger activators on the KOTH Zone. One is set to owner only and the other is set to exclude owner. These are calling enterplayer / exitplayer and enterother / exitother functions on the script. You do not need to adjust these. ##### Server side script for koth zone[​](#server-side-script-for-koth-zone "Direct link to Server side script for koth zone") The KOTH Zone requires a server script that coordinates events across the network. To upload a server script you need to create an empty game object and add the **Server Script** component. Attach the KingOfTheHillServerSide LUA script from the Shooter / scripts project folder. Give the script a class ID. This can be anything so long as you reference it on the King of the Hill zone itself. Best practice would be to follow Java style namespaces; com.sinewavecompany.sinespace.fps.koh Add a virtual goods component to the object and select type / Server Script. Fill out the virtual good component as usual and upload. Please note the server script will not appear anywhere in your inworld inventory. Once uploaded, copy the item ID; when you upload a virtual good item you can see the item ID both in the title bar of the virtual good component in the editor and in the item list in your curator.sine.space account. On the KOTH zone itself add the **Require Server Script** component. Add the item ID from the server script you uploaded. Add the class ID, copying and pasting it from the server script. Now when you upload the KOTH Zone with the **Require Server Script** component attached it will listen to the **Server Script** you have uploaded. --- ### Player spawn points #### Overview[​](#overview "Direct link to Overview") FPS Components Shooter games FPS The safe zone lobby Guns and gun givers Health and ammo givers Traps King of the hill zone Enemy NPCs and NPC spawners Multiple **Player Spawn Points** can be placed anywhere in a map. ###### FPS Components[​](#fps-components "Direct link to FPS Components") [Shooter games FPS](/sinespace-sdk/games/shooter-games-fps.md) [The safe zone lobby](/sinespace-sdk/games/the-safe-zone-lobby.md) [Guns and gun givers](/sinespace-sdk/games/guns-and-gun-givers.md) [Health and ammo givers](/sinespace-sdk/games/health-and-ammo-givers.md) [Traps](/sinespace-sdk/games/traps.md) [King of the hill zone](/sinespace-sdk/games/king-of-the-hill-zone.md) [Enemy NPCs and NPC spawners](/sinespace-sdk/components/enemy-npcs-and-npc-spawners.md) Multiple **Player Spawn Points** can be placed anywhere in a map. When each player leaves the Safe Zone Lobby to enter the game they are teleported randomly to one of the spawn points. These are separate items that can be uploaded as furniture items so that players can place the spawn points across their maps how they want to. The positioning of the spawn points themselves is far more strategically important than the positioning of the safe zone. This video tutorial shows how to wire up and publish your own Player Spawn Point as an inventory item players can in place in their own customised multi-player maps in Sinespace; [YouTube video player](https://www.youtube.com/embed/3f-pcwu0LBk) 1. Public variables The public variable on the Player Spawn Point allows players to define a team for individual spawn points when they are placed in the map. The spawn point will then only be available to players on that team. A spawn point can also be left open for all players. (Please note, as of writing the team system for the FPS is still in development and the team functions on the Player Spawn Point are not yet active.) 1. Events There are three events on the Player Spawn Point; free, red and blue. These trigger particles or other events relating to the status of the spawn point. Players laying out team based maps can configure individual spawn points to spawn only players on specific teams or to be open for all players. --- ### Racing Games #### Overview[​](#overview "Direct link to Overview") Racing game components are easily accessible for everyone. ![RacingComps.png](/assets/images/racingcomps-6e88f704a46932ea303da2b6cdb3a052.png) Racing game components are easily accessible for everyone. Racing game furniture items can be found in the Sinespace Shop. When in the Shop, click on the Furniture tab, then use the search-bar to look for dotEnterprise, and you will see all of the below items listed: ![600px-Racingitems.png](/assets/images/600px-racingitems-89096e155b3ed56a28bc74d319f151cc.png) You will need all of these items to create a racing game. ##### Unpacking the furniture items[​](#unpacking-the-furniture-items "Direct link to Unpacking the furniture items") The Racing Item Bundle will need to be unpacked before you can use the items. To unpack the bundle, click on it in your Inventory, then click on Use. ![300px-Racingbundle.png](/assets/images/300px-racingbundle-73f1738248b3d70b21bfed49981750ac.png) ![Usebundle.png](/assets/images/usebundle-c2f236082322b27973496f5635985bb5.png) When you have clicked on 'Use' there will a pop up for the bundle. ![300px-Getbundle.png](/assets/images/300px-getbundle-db56b3a34a6cfe7ef284aca143193669.png) Click on the 'Get' button, and this will add all the listed items to your inventory. ##### Setting up a private region as a race track[​](#setting-up-a-private-region-as-a-race-track "Direct link to Setting up a private region as a race track") You will need a large region to set up a race track. You can either make your own race region in Unity and upload it, or you can use a home template from the Shop. If you are making your own region for the race track, you will need to upload the region as a home template. To see how to do this, please see our Room Floor Component page and our Regions page. To find a home template in the Shop, go to the Regions tab and you will see all of the home templates we have. ##### Placing the Racing Items in a region[​](#placing-the-racing-items-in-a-region "Direct link to Placing the Racing Items in a region") You can set up these racing items to make a lap race in your region. ###### Placing the Racing Start Gate[​](#placing-the-racing-start-gate "Direct link to Placing the Racing Start Gate") You will need to place the Start Gate where you want the race to start. The racers will start on the side of the gate that has the green marks: ![Startinggate.png](/assets/images/startinggate-8588bc6424515e608848ad9894cfb83f.png) ###### Placing the first Checkpoint[​](#placing-the-first-checkpoint "Direct link to Placing the first Checkpoint") Once you have placed the start gate, you can then place the first checkpoint. This is the Racing Lap Checkpoint furniture item. This will need to go after the Starting Gate. Here is an example: ![Startandcheckpoint.png](/assets/images/startandcheckpoint-ac29a2164ec4c718e20ca901d75467d5.png) Each checkpoint you place down will be labeled Checkpoint 1 to begin with. You will need to change the checkpoint numbers for the race laps to work correctly. To change the checkpoint number, walk up to the checkpoint you want to change, and you will see a cube. Click on it. ![Checkpointchange.png](/assets/images/checkpointchange-0ff09c401248ff612544e94645f14045.png) When you click on it, it will open a UI. Here you can enter the checkpoint number. ![500px-Checkpointui.png](/assets/images/500px-checkpointui-c1541c263da1e55dd8064a9a16f9a0c5.png) Click on the Update button to update it to the number you entered. ###### Placing more checkpoints[​](#placing-more-checkpoints "Direct link to Placing more checkpoints") You can place as many checkpoints as you want in your region, but if you want the race to be more than two laps, make the race shorter by placing less checkpoints. Here is an example of a small lap race: ![Checxkpointssmall.png](/assets/images/checxkpointssmall-406bf1c336a9eead17d57ece78bcafb2.png) ###### Racing Display[​](#racing-display "Direct link to Racing Display") Once you have finished placing all of the checkpoints, you will want to add the Racing Display. ![Racingdisplay.png](/assets/images/racingdisplay-f0ca342e8585488362416c06efec0c7d.png) The racing display shows a list of the racers, their lap times and how many laps they have done. You can click on Laps to change the number of laps and click on 'Start' to start the race. You can click on 'Reset' after starting the race to reset the times and laps. You can change the race type on the display by clicking on the mode switch button: ![Switchmode.png](/assets/images/switchmode-a6dcb55b92e194256afaf2bbed7548f8.png) The modes are lap mode and race mode. Keep this on race mode for a lap race. If you click on the magnifying glass on the top left of the racing display, this will focus your camera on it so you can read it clearly. You can also see the information on the display by clicking on the yellow arrow: ![Yellowarrow.png](/assets/images/yellowarrow-a2effdf9df829fc5eec836ecf9d22f98.png) This will open up the UI on the screen so you can see it while racing. That is how to set up the furniture as a lap race; Please note that at the moment these racing furniture items only work with modular vehicles. We are currently updating older cars to this new system. --- ### Shooter games FPS #### Overview[​](#overview "Direct link to Overview") The First Person Shooter system has been scripted by dotEnterprise, one of the Sinespace community developers, using the Sinespace SDK. The First Person Shooter system has been scripted by dotEnterprise, one of the Sinespace community developers, using the Sinespace SDK. You can take these components and build your own projects with them. You can collaborate with other artists and developers building content with these components on the public Sinespace servers. They also provide a useful frame of reference for developing your own unique games and game components using Sinespace and Unity. The open source FPS components enable developers and artists to create a wide range of highly customisable mutli-player shooting games and maps on the Sinespace platform. They were created by Ulli at DotEnterprise and can be downloaded here; Demonstration templates are also found in the Shooter folder in the Sinespace editor pack. This video provides an overview of the FPS system and how it’s core components can be used to build an FPS in such a way that players have unlimited options for building, customising and sharing their own unique playable maps; [YouTube video player](https://www.youtube.com/embed/v4M56ovvFp8) info
See the pages below for more information on the different components: [The safe zone lobby](/sinespace-sdk/games/the-safe-zone-lobby.md) [Player spawn points](/sinespace-sdk/games/player-spawn-points.md) [Guns and gun givers](/sinespace-sdk/games/guns-and-gun-givers.md) [Health and ammo givers](/sinespace-sdk/games/health-and-ammo-givers.md) [Traps](/sinespace-sdk/games/traps.md)[King of the hill zone](/sinespace-sdk/games/king-of-the-hill-zone.md) [Enemy NPCs and NPC spawners](/sinespace-sdk/components/enemy-npcs-and-npc-spawners.md) --- ### The safe zone lobby #### Overview[​](#overview "Direct link to Overview") FPS Components Shooter games FPS Player spawn points Guns and gun givers Health and ammo givers Traps King of the hill zone Enemy NPCs and NPC spawners The Safe Zone Lobby is a game lobby inside the region. ###### FPS Components[​](#fps-components "Direct link to FPS Components") [Shooter games FPS](/sinespace-sdk/games/shooter-games-fps.md) [Player spawn points](/sinespace-sdk/games/player-spawn-points.md) [Guns and gun givers](/sinespace-sdk/games/guns-and-gun-givers.md) [Health and ammo givers](/sinespace-sdk/games/health-and-ammo-givers.md) [Traps](/sinespace-sdk/games/traps.md) [King of the hill zone](/sinespace-sdk/games/king-of-the-hill-zone.md) [Enemy NPCs and NPC spawners](/sinespace-sdk/components/enemy-npcs-and-npc-spawners.md) The Safe Zone Lobby is a game lobby inside the region. It is where players are moved when they first arrive in the scene and it is where they respawn when they die. Players cannot shoot or be take damage in the safe zone. Leaderboards, game instructions and other game options can be made available to players in the game lobby. The core mechanics of the game are governed though the Combat Meter which is part of the Safe Zone Lobby. The public variables on the Combat Meter allow developers and players to configure game settings including player health and max bullets. This video tutorial shows how to wire up and publish your own Safe Zone Lobby as a spawnable item players can in place in their own customised multi-player maps in Sinespace; [YouTube video player](https://www.youtube.com/embed/ZRmO57uyGdU) ##### Combat meter[​](#combat-meter "Direct link to Combat meter") The core functions of the game are managed by the Combat Meter. 1. Public variables The public variables can be made available inworld if you want to you can allow individual players to configure these in their regions. If you want to expose the public variables inworld, when you upload to Sinespace, on the virtual goods component set the Customisation Capabilities to Full. If you want to hide the public variables set the Customisation Capabilities to Basic or Disallowed. * PlayerSpawnMinRange and PlayerSpawnMaxRange\*\* defines a radius from the centre of the safe zone where players will spawn and respawn. It defaults to 5 meters. * PlayerMaxHealth\*\* allows you to set the player max health. * PlayerMaxBullets\*\* allows you to set the max bullets per gun. This is currently a universal value across guns. * DeathSequenceDuration\*\* sets the time from dying to arriving back at the safe zone. It defaults to five seconds which is time to play a death animation and change camera angles during the player death event. * TeleportEffectDuration\*\* This sets the amount of time for particles you can trigger when the player teleports from the safe zone to a spawn point in the game. * PlayerStartHealth\*\* is the amount of health a player has when they spawn into the game. * Channel.\*\* This is the channel the components communicate on. You should not need to alter this from the defaults. 1. Resources There is one resource referenced on the Combat Meter; the gunBarIcon. This is a canvas element that sits behind the individual gun icons in the gun bar when players have one or more guns enabled during gameplay. 1. Events There are seven events referenced on the Combat Meter; * damage * die * teleportStart * teleportEnd * AmmoAdd * hpUp * showOwnerControl * npcKill * avatarKill * The damage\*\* and **die** events trigger animation events in the Animation Controller attached to the Combat Meter. These events are both canvas based; a damage vignette when the player is hit and a message on screen when they die. These canvas events occur in parallel with the animations triggered in the player’s Animation Override, which is part of the gun the player has enabled during gameplay. * teleportStart\*\* and **teleportEnd** can trigger particles or other events at the Safe Zone Lobby and at the spawn point when a player leaves the lobby and enters the playable map. * AmmoAdd\*\* and **hpUp** events trigger when the player collects ammo or health from the Health or Ammo Givers. * showOwnerControl\*\* exposes a canvas based toggle inworld that players can use to disable the game when in room edit mode. * npcKill\*\* and **avatarKill** are events that can be triggered when NPCs or other players are killed by the player. 1. Object references The 11 object references on the Combat Meter reference the various active canvas elements in the player HUD. The references do not require manual configuration. ##### Player HUD[​](#player-hud "Direct link to Player HUD") The **PlayerHUD** presents the number of kills, the health bar, game points and ammo levels. You can move elements on the canvas around, change fonts, colour, etc. to bring the HUD in line with your art. ##### Nav mesh obstacle[​](#nav-mesh-obstacle "Direct link to Nav mesh obstacle") The **Nav Mesh Obstacle** on the base of the Safe Zone ensures that when a player places the Safe Zone Lobby in their region, any NPCs in the region will not walk through it. ##### Proximity activator[​](#proximity-activator "Direct link to Proximity activator") The **Proximity Activator** on the base of the safe zone is triggered when the player within a certain radius of it. It switches the combat HUD off and disables gameplay when the player is inside the Safe Zone Lobby. It should be set to **Client Only** – if unticked, whenever one player entered the safe zone the game would stop for everyone! ##### Bullet pool manager[​](#bullet-pool-manager "Direct link to Bullet pool manager") The **Bullet Pool Manager** creates a pool of reused bullets in the viewer, as a more efficient method of managing bullets than creating and destroying individual game objects. The pool defaults to a pool of 20 bullets. If you are creating a gun with a very high fire rate you might need to expand that pool but we limit network messages to 12 per second so you will hit performance issues if you go too high. The **poolItemTtl** field is the lifetime of the bullet, in seconds. ##### Owner control panel[​](#owner-control-panel "Direct link to Owner control panel") The Owner Control Panel allows the map owner to set the Safe Zone Lobby to be inactive while they move it around in the scene and spawn other game items. --- ### Traps #### Overview[​](#overview "Direct link to Overview") Traps can be anything in the scene that damages the player. The default template in the sample art package is a fire trap that players can place anywhere in their maps. The trap system could also be used to create a wide range of other hazards, for instance bombs, or a roving laser cannon as shown in the tutorial video. The public variables on the trap component include settings for damage amount and damage rate. This video tutorial shows how to configure and publish your own traps as inventory items that players can place in their multi-player maps in Sinespace: [Watch on YouTube](https://www.youtube.com/watch?v=PB_Q_jtEK10) #### Public variables[​](#public-variables "Direct link to Public variables") The trap has two public variables, **trapDamage** and **trapInterval**. These define the amount of damage the player will take and how often, for as long as the damage trigger is activated β€” in the case of the default art, by a trigger activator. ![Trap public variables in the Unity inspector](/assets/images/trapsvariables-6cb99136811436b15331e390262d272b.png) #### Events[​](#events "Direct link to Events") There are four events: * activateTrap * deactivateTrap * damage * kill ![Trap events in the Unity inspector](/assets/images/trapsevents-69d015ce8e6113c531150936144ee93d.png) These events allow you to add whatever cosmetic or animated events you want to the trap. In the sample art the activate and deactivate trap events swap between large and small flames, with the flames increasing as you come close to the damage collider. #### References[​](#references "Direct link to References") There is one object reference: the proximity activator. This switches the trap on β€” not to do damage, but to listen for the player. In the sample art this switches on when you get near the damage collider and the particles swap from small to large flames on activation. You do need to retain the proximity activator in the references field. ![The proximity activator in the trap\'s object reference field](/assets/images/trapobjectref-affc0b158a756ffa5844c7e5681539e9.png) #### Related[​](#related "Direct link to Related") * [Shooter Games FPS](/sinespace-sdk/games/shooter-games-fps.md) --- ### Quests #### Overview[​](#overview "Direct link to Overview") The quest system allows users to build narrative structures in space. The quest system allows users to build narrative structures in space. Usually driven by interactions with NPCs in your regions, quests can lead users through gameplay or learning and training modules, or through tours, stories or other step-based user engagements. ##### Understanding the Quest System[​](#understanding-the-quest-system "Direct link to Understanding the Quest System") Quests are depicted by a blue exclamation mark above a Quest Giver which can be any type of clickable GameObject (with a collider component).
Clicking on the Quest Giver shows the first Quest Dialog Box (the first Step, numbered 0 in Unity) with a Start / Cancel option. Quest Dialog Box shows the Name and the Description of the Step (see below).
As soon as the user accepts the quest, next steps are shown as a blue question mark.
On the left of the screen, below the radar, The Quest Name ([Quest Designer Component](/sinespace-sdk/quests/questdesigner.md)) appears with the number of steps and the hint to reach the next step. Hints are related to a future step the user needs to reach (usually the next step). So the hint needs to be written on the Step the user needs to reach.
For that reason, there is no need to write a hint inside step 0 (the opening step), unless for some reason the quest brings the user back to the Quest Giver. More to come ... ##### Setting up a quest[​](#setting-up-a-quest "Direct link to Setting up a quest") The Quest Giver All quests are started by the user clicking an object, the so called Quest NPC which presents the quest.
The user opts-in to the quest. To turn any object in your scene into the Quest NPC, add the [Quest NPC component](/sinespace-sdk/components/quest-npc.md) to it.
You can use a humanoid NPC. Use the [Statue component](/sinespace-sdk/components/statue.md) object, rendering the NPC as a character. Then add the QuestNPC component to that.
You can add the [Quest NPC component](/sinespace-sdk/components/quest-npc.md) to any object with a collider on it. The user clicks on that object to start the quest. ![Questnpcscript.jpg](data:image/jpeg;base64,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) Quest NPCs are placed into the *Destination NPC field* in any Step Inspector of your quest (see below). Quest Manager ![Questdesignerscript.jpg](/assets/images/400px-Questdesignerscript-b3a7d36509dd58ffaa5cddc66a77042c.jpg) Create an empty game object in your scene, set it to location 0,0,0 and add the Quest Designer game component to it.
Give the quest a name and a description. Quest type * Daily : users can play it once every day. * Main : users can play the quest only once. * Side : can only be triggered by another quest. * Activity : users can replay continually. * Temporary : ? Quest ID Click the reserve ID button in the inspector to assign a unique id to your quest.
The quest ID is generated automatically when you click reserve.
Warning: DO NOT delete the Quest ID Inspector field. If you don't remember that number, you will need to reserve a new one. If this quest is a used in a dependency list, you will have to edit all the quests that depend on it... Quest Dependency IDs You can chain quests together using dependency IDs
Set the size to the number of quests that need to be completed before this quest is available. Hit 'enter' and that number of fields will appear.
To each field, add the individual quest ID of one of the quests that must already be completed by the user.
This allows you to have multiple quests initiated by the same quest NPC, in a series. Reward ID Add the curator ID for any virtual good item you have uploaded.
You can get this from the virtual goods component attached to the reward object (once it has been uploaded), or from the item list in your account at curator.sine.space.
The reward virtual good object must be live before it can be given by a live quest. Open Canvas button This button opens an Editor Window which allows you to build your quest, adding steps.
Add the first step and reference the Quest NPC object (place the object into the Quest NPC field). ##### Quest steps[​](#quest-steps "Direct link to Quest steps") You can add quest steps one at a time, building your story.
Each time you add a step it will duplicate your last step. ###### Add a step[​](#add-a-step "Direct link to Add a step") Open the Quest Designer Canvas. Clic Add Step button. ![Questnpc.jpg](/assets/images/Questnpc-2a94e91c9918c708deb9fcf4e14d860a.jpg) ###### Delete a step[​](#delete-a-step "Direct link to Delete a step") You can delete a step within a chain; its child will be reconnected to the parent step.
You cannot delete the first step. ###### Reorder a step[​](#reorder-a-step "Direct link to Reorder a step") Click on the little arrow visible at the top left corner in the step inspector window.
You cannot reorder the first step.
If there are only 2 steps in your quest, you won't see the arrow from the second step. ##### Step Types[​](#step-types "Direct link to Step Types") ###### NPC[​](#npc "Direct link to NPC") The NPC step type is mandatory for starting the quest. The step 0 will be of type "NPC" and you cannot edit it to make it a different type. Other steps can be of type NPC: use a GameObject (or any object) and attach the [Quest NPC component](/sinespace-sdk/components/quest-npc.md) to it, placing it in the Destination NPC field. ###### Activity[​](#activity "Direct link to Activity") ![Activity.jpg](/assets/images/Activity-125f92e31657bd58ed51c91f28fb5748.jpg) The activity step is a general step which you can use to deploy a wide range of activities which the user must complete before the next step initiates. Activity You can drag any β€œStartable” component into into the Activity field in this step. The space quest system includes a range of standard startables you might want to use; for example, you might require a user to wear a particular clothing item or sit on a particular furniture item. For more information on startables go [here](/sinespace-sdk/quests.md). Scripting your own startables You can also write your own startables, which can be full game rounds or learning modules; the user has to complete each one before moving on with the quest. Autoplay Tick autoplay if you want this step to start immediately as the prior step completes. If you leave autoplay unticked the user will need to click the quest NPC to start the step. You may need to leave the Autoplay unticked if your prior step is one that is registered as complete at the start of the step and the user will still engaged in an unrecorded activity before needing to move on. For instance if the prior step was an activity step using the StartableGestureRequirement, the quest system will register the user as having completed the step when they initiate a gesture but that gesture may take 30 seconds to play, during which you may not want the next step to initiate. Replay Discussion NPC The Replay Discussion NPC is the object in the scene the user needs to click if they have failed to complete the quest step. This may be because the quest step is a game component which can be failed; or a learning component with a passing grade. Or it may be because they logged out or were disconnected half way through the deployment of the startable. The replay NPC can be your original Quest NPC but if that is geographically some distance from the relevant quest step you may chose to put another object near the quest step activity which the user can click to restart the step. This can be any object with the Quest NPC component added to it, dragged into the Replay Discussion NPC field in the step. Area Hint If you are using a navmesh to guide your users around the quest, the area hint will tell them where to go. It might usually be the same object as the Replay Discussion NPC but it can be any game object you drag into the field. ###### Quest[​](#quest "Direct link to Quest") ![Quest.jpg](/assets/images/Quest-e98fbaa9321dc011e4422605deaa99c7.jpg) The quest step allows you to embed one quest inside another. This is a great way to move users from one region to another. (You can also use the Quest Game Object component to spawn teleportation portals at the right moment in front of the user, leading them to the next region.) Subquest ID Paste the ID of the child quest here. ###### Visit Location[​](#visit-location "Direct link to Visit Location") ![Location.jpg](/assets/images/Location-835f1574c849323f2c064a0ef7c4c7f1.jpg) The visit location step requires the user to go to a specific place in your region to continue the quest. Area to Visit Drag any game object including any NPC into this field to require the user to visit this location before the quest continues. This step can be used in conjunction with the navmesh to lead them there via a visible path. For more information on setting up the navmesh in your region go here. (need link) Proximity (meters) Set the proximity in meters to the selected game objects. ###### Collection[​](#collection "Direct link to Collection") ![Collection.jpg](/assets/images/Collection-90184a4c2d6b162f2821282da50ed746.jpg) The collection step requires the user to click on and collect a specific game object in the scene. Collectible Item Add the Quest NPC component to the object you want the user to click on and collect. Drag the object into the Collectible Item field in the quest step. Make sure it has a collider on it so the user can click it. Area Hint If you want the navmesh to lead the user to the collectible, you can drag it into the Area Hint field. If you want them to have to search without a hint leave it empty or add your original Quest NPC to guide users back to the quest area in the event they leave the region during this step. Counter ![Counter.JPG](/assets/images/Counter-8d2552425df51eb0868124de0009ba11.JPG) The counter step requires users to collect a defined number of counters. Use this step in conjunction with objects in the scene that have either the Quest Counter Clickable or Quest Counter Proximity component attached. You may also want to use the Startable Timed Counter which offers similar functionality to this step, when added to the Activity step, but on a timed basis. Number required Specify the number of counters the user needs to collect. This can match the total number available in the scene or there can be far more in the scene than the required number, depending on the nature of your game. Quick ID Picker/Token ID Add whatever ID you have manually applied to the Counter ID field of the Quest Counter Clickable or Quest Counter Proximity component attached to your counters. Area Hint Use this in conjunction with the navmesh feature to guide people to an area, or drag your Quest giving NPC here to guide users back to the start of the step should they relog before completion. ###### Conversation[​](#conversation "Direct link to Conversation") ![Conversation.jpg](/assets/images/Conversation-9d624cceb3995d948e3b28d58c7c7f83.jpg) The conversation step allows you to build cut scenes in the quest, with successive combinations of dialogue, camera, audio and animation on the NPC and the player. To edit the conversation step open the Quest Canvas (from the button at the bottom of the quest chain in the inspector window). Conversation Actors ![Conversationactors.jpg](/assets/images/Conversationactors-508360e52e97369a602a0112102949ff.jpg) The conversation actors can be one or more NPCs and the play themselves. Add an actor and drag any object with the Quest NPC component attached to it to the NPC Object field. Actor Name This will appear in dialogue panels during the conversation. Is Player Tick this to use the player as your actor. Add %PLAYER% to the Actor Name field to use the username in dialogue. Move to location Add an empty game object in the scene to this field to move your player to this location for the duration of the conversation. This allows you to align the player with specific camera shots defined by you during the conversation. Conversation dialogues ![Conversationdialogues.jpg](/assets/images/Conversationdialogues-1a1538b1b7abf37d1f5fd7bb9c04c687.jpg) Once you have defined the actors in your conversation you can add as many steps to the conversation as you want. Actor Choose the actor narrating the dialogue step. Text Enter the text as it should appear in the dialogue panel. Animations You can add an animation to the NPC or the player during the step. Wait for continue? Tick this if you want the dialogue step to remain on the screen until the user clicks continue. Wait timeout Define a time in seconds if you want the dialogue to end and the next to start automatically without the user clicking continue. Camera angle Create an empty game object in your scene and position it so that it looks where you want the user's camera to look during the dialogue. You can position your view in the scene view in the Unity editor and then highlight the game object and in the top menu go to GameObject / Align with view to move the position and rotation of the game object to your view. Dialogue Audio You can add audio clips to the dialogue by dragging an audio file from your project to this field. Use Lip Sync Tick this if you want the mouth of the actor to be animated by your audio file. Cutscene Dialogue Canvas To use the conversation step you need to drag the Cutscene Dialogue Canvas prefab into your scene. This screenspace canvas displays the dialogue during cut scenes and offers the continue button to users if you are using that function in your dialogues. Make sure the Panel, which is a child of the Canvas, is disabled (the tick box in the top of the Inspector). This ensures the panel will only be visible to users during the conversation steps of a quest; left on it will be permanently applied to the screen of everyone in the region. Avoid putting the Cutscene Dialogue Canvas into a parent object, or if you do ensure the parent object is located at 0,0,0 in your scene or the canvas will be offset or invisible to the players. ###### Branch NPC[​](#branch-npc "Direct link to Branch NPC") ![Branchnpc.JPG](/assets/images/Branchnpc-34fe6add994e7a232694be74662b6ef1.JPG) Branch NPC allows the user to setup several option for player to choose. It will lead to different quest steps based on the user's choice. ##### Startables[​](#startables "Direct link to Startables") Startables are components you can drag into the [Activity step](/sinespace-sdk/quests.md) of a quest. You attach the startable component to the relevant game object; it some cases it might be an empty game object created just to house the startable; and then drag that object into the Activity field of an Activity type step in your quest. Startable Components: * [Components/StartableGestureRequirement](/sinespace-sdk/components/startable-gesture-requirement.md) * [Components/StartableClothingRequirement](/sinespace-sdk/components/startable-clothing-requirement.md) * [Components/StartableSitRequirement](/sinespace-sdk/components/startable-sit-requirement.md) * [Components/StartableItemRequirement](/sinespace-sdk/components/startable-item-requirement.md) * [Components/StartableRoomVisit](/sinespace-sdk/components/startable-room-visit.md) * [Components/StartableSnapshot](/sinespace-sdk/components/startable-snapshot.md) * [Components/StartableTeleport](/sinespace-sdk/components/startable-teleport.md) * [Components/StartableTimedCounter](/sinespace-sdk/components/startable-timed-counter.md) ##### Other Components[​](#other-components "Direct link to Other Components") ###### Quest Counter Clickable[​](#quest-counter-clickable "Direct link to Quest Counter Clickable") ![Counterclickable.jpg](data:image/jpeg;base64,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) Add the Quest Counter Clickable component to counters the user must click on to collect. Counter ID Enter an ID of your own creation to the Counter ID field and add the same ID to the Counter ID field of the Counter quest step or the Startable Timed Counter component. ###### Quest Counter Proximity[​](#quest-counter-proximity "Direct link to Quest Counter Proximity") ![Questcounterprox.jpg](data:image/jpeg;base64,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) Add the Quest Counter Proximity component to counters the user must be within a certain proximity of in order to collect. Counter ID Enter an ID of your own creation to the Counter ID field and add the same ID to the Counter ID field of the Counter quest step or the Startable Timed Counter component. Trigger Distance Specify the distance from the object that will trigger a successful collection. ###### QuestGameObject[​](#questgameobject "Direct link to QuestGameObject") This allows you to rez and and derez items in your scene during specified quest steps. Configurable parameters: * QuestID * MinStep * MaxStep Attach to other objects (preferably a parent group, if you're updating multiple in a single step) It enables or disables the object it is on, based on whether the user is inclusively on any step between Min and Max. Objects can only be seen by the player. ###### PlaceAtOrigin[​](#placeatorigin "Direct link to PlaceAtOrigin") This will place an object at the origin of the avatar; 0,0,0 relative to that avatar, non-attached. To offset, place empty parent object with PlaceAtOrigin script and then offset visible object from invisible parent. ###### %PLAYER%[​](#player "Direct link to %PLAYER%") Use in quest text fields to add player name to dialogue. ###### Replay NPC[​](#replay-npc "Direct link to Replay NPC") If it's possible to fail an activity step drag the quest NPC into the β€œReplay NPC” field. It will show a "!" asking the user to repeat the step. --- ### QuestDesigner #### Overview[​](#overview "Direct link to Overview") Create an empty game object in your scene, set it to location 0,0,0 and add the quest designer game component to it. Create an empty game object in your scene, set it to location 0,0,0 and add the quest designer game component to it.
![](/assets/images/400px-questdesignerscript-b3a7d36509dd58ffaa5cddc66a77042c.jpg)
Click the reserve ID button in the inspector to assign a unique id to your quest. Click to add a step and give the quest a name.
Quest type * Daily-users can play it once every day. * Main-users can play the quest only once. * Side-can only be triggered by another quest. * Activity-users can replay continually.
Quest ID The quest ID is generated automatically when you click reserve.
Quest Dependency IDs You can chain quests using dependency ID-Set the size to the number of quests that need to be completed before this quest is available. Then add the individual quest ID of each quest that must already be completed by the user. This allows you to have multiple quests initiated by the same quest NPC, in series.
Reward ID Add the curator ID for any virtual good item you have uploaded. You can get this from the virtual goods component attached to the object once it has been submitted, or from the item list in your account at curator.sine.space --- ### Two Step Quests #### Overview[​](#overview "Direct link to Overview") Two step quests are usually used for creating quests which give out Silver, making item hunts or giving gifts. Two step quests are usually used for creating quests which give out Silver, making item hunts or giving gifts. Here we will be showing how to set up the quest and how to place a quest like this is a region you upload and also how to make the quest into an item you can upload as a virtual good. ##### Setting up the quest clickable object[​](#setting-up-the-quest-clickable-object "Direct link to Setting up the quest clickable object") The clickable object is the object the user will click on to receive the gift or silver. You can use any item you want for this. You need to set up this object so it can be clicked on. The clickable object needs a collider on it, and a Box Collider is fine most of the time for this. Click on the object, and then click on Component, Physics and Box Collider if it isn't already on the object. Next thing you need to do is add the Quest NPC script to the object. Make sure you have the object selected, and click on Add Component, then search for Quest NPC and add it. This will add the script to the object. ![QuestNPC1.png](data:image/png;base64,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) You can check Hide Dialogue for hunts and gift giving quests. Hide Quest Bang can make the quest a little harder as it won't show the quest '!' mark above the quest items. Next thing to do is add the Quest Designer Script to the object. Make sure it is selected, click on Add Component and search for Quest Designer then add it. The quest designer script is where you can set the settings for the quest. ![QuestDesigner1.png](/assets/images/questdesigner1-958d23939f60c4b4dbebb4c98f7fb075.png) Quest Name - This is where you will add the name of the quest. Description - This is where a small description of the quest can go. Type - This is what type of quest it is. The options for type of quest are: * Daily Quest - This is a quest which will be active daily, so users can complete this every day they log in. * Main Quest - This is a quest which will only be available once for the user to complete. * Side Quest - This is a side quest, which will only be available once. * Activity Quest - This is a quest used for activities, such as an in-world game or a hunt quest and can be repeated. * Temporary Quest - This is for a quest which will be temporarily available to users. Quest ID - This is the ID of the quest. You need to click on Reserve to get the quest ID. Quest Dependency IDs - You can ignore this for a two step quest. Suppress reward and end dialogue - Again, we don't need this for this type of quest, but this just stops the reward from being granted. Reward ID - This is the important thing to note: The reward ID is where you will enter the ID of the reward item. If you are making a repeatable quest, like an activity quest, leave the reward ID at 0, as this will give the user Silver. It will give Silver again after a cool-down period. Fill in the quest name, description and type. If you want users to be able to get the reward only once, set the type to Main Quest. If you want the quest to be repeated, set it to Activity. Click on the Reserve button next to the Quest ID to get the ID of the quest. Click on the Open Canvas button. This will open the quest canvas, and this is where you will add all the details for the quest. ##### Quest Canvas[​](#quest-canvas "Direct link to Quest Canvas") As said above, this is where you actually add the details for the quest. ![QuestCanvas.png](/assets/images/questcanvas-e260758c7a1708c4b6320b6fbf17dff3.png) As you can see, it has copied over the information from the Quest Designer. But, you still need to add steps to the quest. Click on the Add Step button, to make the first step in the quest, and then click on the Add Step button again to add the second step. Move the second quest step box over so you can see both boxes. ![Queststeps1.png](/assets/images/queststeps1-a4f6ee5f395279c3ac4362189c6e4a63.png) In the first quest step box, copy the name over from the Quest Name box to the Name box. In the Dialogue box, type out the dialogue you want the Quest UI to say, for example, if you have set it up to be a hunt quest, you might put something like 'You have found the Easter Egg!' If you need to put a hint, you can, but this is usually used for longer stepped quests. In the second quest step box, name it something like Give Prize, then go back to the first step box, and choose the Next Step to be the Give Prize step. In the second quest step box, check the Supress Nav Line because the user does not need to go to a different location to finish the quest. In both of the step boxes, set the Destination NPC to be the clickable object you made at the beginning. ![900px-DestinationNPC.png](/assets/images/900px-destinationnpc-6d772392ab1dd58f87e118fec7503da6.png) You can do this by dragging the item from the hierarchy to the Destination NPC boxes. Note: Leave the Reward item ID box at 0 if you want the user to get Silver. Leave it blank in both the Quest Designer and Quest Canvas for now if you want to reward the user with an item, as you need to get the ID first. ##### Reward IDs[​](#reward-ids "Direct link to Reward IDs") If you are making a quest which only gives users Silver, in the Quest canvas and Quest Designer, leave the Reward Item ID at 0. If you want to give the user an actual item as a reward, you will first need to upload this item. Upload it as you usually would, for example, if it is an item of clothing, upload it using the clothing item settings and the virtual good component. If it is furniture, upload it as a furniture item with the Room Furniture component added to it. If you want it to be spawnable, set it as a Generic upload in the virtual good component. Once the item is uploaded, take note of the item ID. This is the ID you will need to put in the Reward item ID box. ![RewardID1.png](/assets/images/rewardid1-4d3a95dc62bdf96d456390199c8b54e7.png) You only need to put the item ID in the Quest Designer, as it will automatically copy it over to the quest canvas. ##### Uploading the quest as a virtual good[​](#uploading-the-quest-as-a-virtual-good "Direct link to Uploading the quest as a virtual good") To upload the quest as a virtual good which can be placed anywhere, you need to set it up as a Furniture item. To do this, add the Room Furniture component to the quest object. ![Roomfurniture1.png](/assets/images/roomfurniture1-069657475cbfa8885fe86fd94567138a.png) You can set the placement of the item to be placed on the floor, walls or ceiling. Under collider, you want to drag the Collider of the object into Main Collider. Once this is set up, you can add the Virtual good component. Under basic, set the content type to furniture, then give it a furniture category. Usually Decoration is a good category for this. Fill in the rest of the virtual good, and then upload the item to Sinespace. ##### Uploading the quest within a region[​](#uploading-the-quest-within-a-region "Direct link to Uploading the quest within a region") To upload the quest within a region, you need to only add the Quest Designer component to the quest clickable object. The Quest NPC can then be any other object in the scene. You can upload the region as you normally would, and the quest will be uploaded in the region. --- ### Regions #### Overview[​](#overview "Direct link to Overview") There are different ways to build regions in Space. You can build region assets in other software packages and import them into Unity, you can use Unity's mesh shapes and terrain tools, and you can grab third-party assets from the Unity Asset Store. All of the pages linked here refer to the Scene Export Settings / Scene Save Settings component. ![How to create a shop banner](/assets/images/howtocreateashopbanner-cd13c060731aa2c4acd0123d346bc771.jpg) ![The Scene Save Settings component](/assets/images/scenesavesettings-ef2c1fe366596cedfd94337797f37c99.jpg) If you want to upload a region quickly, click **File > New Sinespace Scene** in Unity to instantly create a quick-start region. #### Assemble your scene[​](#assemble-your-scene "Direct link to Assemble your scene") You can upload any scene you create in Unity as a region in Space. Once your scene is assembled you have two housekeeping tasks. #### Remove the main camera[​](#remove-the-main-camera "Direct link to Remove the main camera") When you create a new scene in Unity it will by default have a light and a camera. You need to delete the camera by selecting it in the Hierarchy window and pressing delete. ![Removing the main camera in Unity](/assets/images/camera-162411303313e230623e1d2689061850.jpg) #### Add a landing zone[​](#add-a-landing-zone "Direct link to Add a landing zone") You need to define where users arrive when they log in to your region, and what direction they are facing. To do this, once your scene is set up, select **Game Object > Create Other > Landmark** from the top menu in Unity. If your Scene Hierarchy menu does not include **Create Other > Landmark**, create an empty object, then in the Inspector add a **Landmark Behaviour** component. This places a new landmark item in your scene. In the Inspector window, set the type to **Landing Zone** and tick **Spawn Point**. The in-scene object is a yellow-edged transparent plane which you can position anywhere in your scene. The yellow arrow points in the direction your visitors will face when they arrive. Be careful to position the landing zone slightly above the terrain; if a tall avatar's feet arrive below the terrain they may fall through. ![A landmark placed in the scene](/assets/images/landmark-176333f3b045da840625d344095bf643.jpg) #### Add a new scene to your region[​](#add-a-new-scene-to-your-region "Direct link to Add a new scene to your region") This does not apply if you are using Multi-Scene Mode & Multi-Scene Editing. You can have more than one scene in your region. 1. Create a new scene in your current Sinespace project. 2. Double-click the new scene in your Assets to load it into the Hierarchy. 3. Design your scene, and be sure to save it. 4. When ready to upload to the server, click **Space > Scene Settings**. 5. Fill out the needed information and map pictures, then click **Automatic Submission**. To teleport from one scene to another, see [Teleport World](/sinespace-sdk/components/teleport-world.md). #### Create a home region or template[​](#create-a-home-region-or-template "Direct link to Create a home region or template") If you want to make your region a home type, which could be edited by the users themselves, you need to attach a component called **Room Floor** to one of the items in the scene β€” usually the terrain or the object used as a field. With at least one Room Floor component, the region will show an **Edit Room** button when you are in it. You can add several Room Floor components to different objects; each floor can be shared with another user, giving them the authority to edit it. In your inventory, you will also find an item with the same name as the region. This is a home template. You can use it in the **Edit Room > Design** function to change the whole set of a region. You can also set a price for it when you upload, so other users can buy it in the shop. For more advanced settings, see the [post zones page](/sinespace-sdk/regions/post-fx.md) and the [lighting an interior page](/sinespace-sdk/regions/lighting-an-interior.md). You can also see how [Navigation Bake](/sinespace-sdk/regions/navigation-bake.md) works, and we have information on [Occlusion Bake and culling](/sinespace-sdk/regions/occlusion-bake.md). There are also some handy [lighting tips](/sinespace-sdk/regions/lighting.md). --- ### Creating a Scene #### Overview[​](#overview "Direct link to Overview") For creating anything in space, apart from clothing items, you will need to use the scene option in Unity. For creating anything in space, apart from clothing items, you will need to use the scene option in Unity. Scenes are where you place all of the game objects you are going to use for making regions, in world games or UI elements for space. #### Starting a New Scene[​](#starting-a-new-scene "Direct link to Starting a New Scene") To start a new scene, go to File, and choose New Scene. This will leave you with an empty scene apart from the main camera. #### Building your Scene[​](#building-your-scene "Direct link to Building your Scene") You will want to add items into your scene which you will need and want for the item you are making. For example, if you are building a new region, you will want to add in terrain and objects for your region such as furniture, or trees, or buildings. #### Saving your Scene[​](#saving-your-scene "Direct link to Saving your Scene") When you choose a New Scene, you will want to make sure you save the scene for later changes. To save your scene, go to File, and click on Save Scene, or Save Scene As. You can name your scene, and save it to your Unity Assets folder. When you save it to the Assets folder, this will mean that the scene is in your project window and is easily found whenever you open your Unity project. #### Opening your Scene[​](#opening-your-scene "Direct link to Opening your Scene") To open your saved scene, double click on it in your project window, and this will open the scene with all of the game objects you placed in the scene window. --- ### Creating Terrain #### Overview[​](#overview "Direct link to Overview") All About Terrains In Unity you can hand craft your terrain or use a terrain generation tool. #### All About Terrains[​](#all-about-terrains "Direct link to All About Terrains") In Unity you can hand craft your terrain or use a terrain generation tool. This article will offer learning resources for both methods and some terrain tips. If you wish to handcraft your terrain or even if you're using a terrain generation tool it’s a good idea to have an overview of how Unity’s terrain engine works. Unity Manual – Terrain: [Terrain Unity Manual](https://docs.unity3d.com/Manual/terrain-UsingTerrains.html) Videos: Search for Unity3D 5 terrain tutorials. Recommended videos: Wicked Cat: [Terrain Wicked Cat Studios](http://youtube.com/watch?v=fuEoYM9BDDI) Check the dates of the videos view the newer ones. #### Terrain Generation Tools[​](#terrain-generation-tools "Direct link to Terrain Generation Tools") On the Unity Asset store there are several tools to generate your terrain automatically or with various degrees of control. Gaia - World Creator - MapMagic World Generator - GeNa - Landscape Auto Material - And if you like to sculpt your terrains out of mesh, here is a popular utility: Please check the ratings and read the reviews, also look at when the package was last updated. #### Terrain Optimization[​](#terrain-optimization "Direct link to Terrain Optimization") Here are some articles on terrain optimization. 3D Ace: Here are two articles on optimization, please note there are scripting portions that you can ignore unless you are going to be using the space SDK. Last tip can be found on the Gaia website: --- ### Creating Web GL Friendly Regions #### Overview[​](#overview "Direct link to Overview") While making regions for Web GL, there are a few things you need to bear in mind. While making regions for Web GL, there are a few things you need to bear in mind. Web GL is specifically made for running applications in browsers, so it has a lower standard for graphics than the actual sinespace client. This means the regions you create will need to stick to a few rules to make sure it runs smoothly in the browser. 1\. Regions need to be a light build. Anything up to 30MB is fine to run in a web browser. 2\. Test the region to make sure it can hold 10-12 avatars without crashing. 3\. Try to make objects plain, or add low resolution textures. Maximum resolution for normal textures needs to be 512x512. For billboards, this can go up to 1024x1024. 4\. Use the Unity Legacy shader instead of Unity Standard shader. 5\. Use baked lighting if you want to add shadows. These shadows will be static shadows, but this will stop lag in the region. 6\. Special effects and animations can be used in the region, but keep the count to 4-5 of them. --- ### Export Settings #### Overview[​](#overview "Direct link to Overview") Note: It is highly recommended to create a new region by Quickstart function. Note: It is highly recommended to create a new region by Quickstart function. You can access the Region creation quickstart by accessing the menu sinespace -> About Editor Pack, then create a region. All the basic settings are include when you create a region by quickstart. ##### Overview[​](#overview-1 "Direct link to Overview") Click the Scene Export Settings in the hierarchy, and in inspector, find the Scene Save Settings(Script) component. ![SceneSaveSettings.png](/assets/images/scenesavesettings-760234f6e75a48581a507cfeb52eb24c.png) You can set a splash image and an icon for the loading or preview screen, and also some other settings which affect the base environment of the region. ###### Restrictions & Features[​](#restrictions--features "Direct link to Restrictions & Features") ![RestrictionsFeatures.png](data:image/png;base64,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) Here is some basic function settings which you can disable, like fly, run, and value like edge of bottom ,limit of vehicle speed. You can leave it as default if you don't have specific demands. ###### Region Mode[​](#region-mode "Direct link to Region Mode") The Region Mode defines how your region content is received by your visitors; all at once before they log in, or progressively after they arrive. ![RegionMode.png](/assets/images/regionmode-c71341905027fcc75b0f223e088cab72.png) *Please note that except Single scene option, all the other options are still experimental, they may have strict limits to make them working.* **Single scene** Single scene delivers the entire region to the user as a single file which downloads before their avatar spawns. For regions with download sizes up to 100 mb, Single scene is likely to be an acceptable download time for your visitors. Recommended sizes are around 30-50mb. **Multi bundle** Multi bundle is a form of dynamic loading control (content streaming). It splits your scene into smaller components that are streamed to the visitor progressively. The multi bundle algorithm examines every root object in your scene and compares each with every other root object. It then bundles objects where there is more than 40 kbytes of overlap in shared data between them. These will be delivered to the client together. How you group into root objects has a big factor on how we create bundles; for instance grouping all vegetation or grouping one particular building where users will arrive is a good practice. Too many bundles (i.e. hundreds) will cause brief stuttering for the user while they are unpacking after loading. A reasonable target is 20 – 30 bundles. You can control this through the number of root objects in your scene when uploading. *Note on inter-object links: Inter-object links between objects loaded at different times may break in this export mode - if objects are linked together (e.g. proximity components) make sure they have the same root object* **Requiring elements before scene is entered** When you are using Multi bundle mode you need to select one item in your scene, usually the terrain, and add a component to it called Manual Loading Control or Dynamic Loading Control. Then tick Required Download. This will ensure that the item is sent to the user before their avatar spawns. Without this there is a risk users will arrive and drop through space before your scene loads above their heads. ![Loading control.jpg](/assets/images/loading-control-e7c3b5cbb5896ee7c414780d90e1a390.jpg) **Additive scenes** Additive scenes is a Unity utility that allows you to organise a single region into multiple scenes. You can manually split content, creating a root scene containing occlusion, lightmap and navigation data, with additional scenes loading the content progressively. You will need Unity 5 multi scene tools to manually set this up. You should have your 'Scene Save Settings' in your root scene when packaging for upload - additionally the currently active scene at time of upload, is treated as the root scene. For more information, see; *Note: currently the Additive scenes only support 3 scenes at most.* **Single Scene Streamed** Currently still under testing. Closed to public by server side. ###### Suggested memory[​](#suggested-memory "Direct link to Suggested memory") If your guest's device has less memory (RAM) than this, they will be given a performance warning when entering the region. This mostly affects clients logging in via WebGL or Mobile. ##### Loading Screen & Explore Window[​](#loading-screen--explore-window "Direct link to Loading Screen & Explore Window") The world map allows users to search and browse regions. The Preview Image you supply will be used as a background to preview your region in the World Map. It will also be used as the background while the region itself is loading. * Preview image The image you provide should be a .jpeg file. A 2:1 aspect ratio is recommended. Because the image is stretched to fit different screens it will distort slightly for some users. ![LoadingScreen.png](/assets/images/loadingscreen-8069e1a431e79e396acf114a7da31ba1.png) * Loading logo The Loading Logo Image appears on top of the Preview Image and is not stretched, allowing you to present your brand logo or a region specific title without distortion. The image you supply should be a .png file with 512x256 dimensions. When you import the .png file, ensure the Alpha is Transparency box is ticked; ![Alpha is transparency.jpg](/assets/images/alpha-is-transparency-e871e8cb855ad08879ee76a9efb5c8f8.jpg) ##### Platform Settings[​](#platform-settings "Direct link to Platform Settings") ![PlatformSettings.png](/assets/images/platformsettings-a321d8b0c120b6a45572a99b91ecc5fd.png) The platform settings are some performance related controls for different platforms. If you want to make your region has a better support of some low spec platform, like mobile and webGL, you may need to limit some options to improve the performance. Check here for more info about platform settings: [Regions/Platform Settings](/sinespace-sdk/regions/platform-settings.md) ##### Tools and Reports[​](#tools-and-reports "Direct link to Tools and Reports") ![ToolsReports.png](/assets/images/toolsreports-12c4d58840b3903e9be75d597b1b8bd3.png) ![ToolsReports2.png](/assets/images/toolsreports2-ce7c4c915e5210dbc57170917390b728.png) The reports show some statistic info and script used in this region, and the tools offer some little functions to optimize or control the files needed to upload. For more informations about these tools and reports, check this page: [Regions/Submission](/sinespace-sdk/regions/submission.md) --- ### Furniture Samples #### Overview[​](#overview "Direct link to Overview") Here are some furniture samples you can use for learning how to upload furniture, or you can use them to make variations of colors and styles! Here are some furniture samples you can use for learning how to upload furniture, or you can use them to make variations of colors and styles! [Furniture Samples](http://space-files.s3.amazonaws.com/wiki%20resources/SWE%20Room%20Furniture%20Samples.unitypackage) These samples are collected as a Unity Package. To add them to your Project after downloading, open the Unity Project you have the Sinespace pack on. Right click in your Project Window, and choose 'Import Package>Custom Package'. Choose the downloaded Furniture Samples package, and it will add it to your Project window. You should see this: --- ### Lighting #### Overview[​](#overview "Direct link to Overview") Sine.Spaces uses Deferred rendering. So you can use as many lights as you wish. Sine.Spaces uses Deferred rendering. So you can use as many lights as you wish. Space also implements dynamic environmental lighting and effects, using a [custom skybox shader](/sinespace-sdk/scene-authoring/custom-skybox-shader.md) and [day/night cycles](/sinespace-sdk/components/day-night-cycle.md). Below is the Unity5 documentation for scene lighting. It's a bit long but worth the read. \[[Lighting a Scene](https://unity3d.com/learn/tutorials/topics/graphics/unity-5-lighting-and-rendering?playlist=17102)] Here is a video on the basics of light. \[[Basic Lights](https://unity3d.com/learn/tutorials/topics/graphics/using-lights?playlist=17102)] *** ##### Baking Your Lighting[​](#baking-your-lighting "Direct link to Baking Your Lighting") Baking your lighting will help with overall performance.
1. Make sure any objects that are not moving are set to static, you will find the tickbox upper right
corner of the inspector when you select an object.



2. If the object moves in any way leave it unchecked.
3. Go to Window > Lighting
Be sure the following are checked:
```text Precomputed Realtime GI Baked GI Setting Select the Baked option under Ambient GI drop-down box. Set your Baked Resolution between 8 - 15, the larger the scene the lower the number here. ```

To have lights show on moving objects and avatars you will need to use Light Probes.
1. Create and empty game objects.
2. Add the Probe Drop Plane component.
3. Move this grid with globes to the top of your scene, the object is to scale it so it covers
the overall area of your scene. So over buildings, larger objects.
4. Adjust the Density Setting in the Drop Plane so the globes are evenly covering your scene.
If its darker add a bit more then if a scene is well lit.
5. Click Update and the drop plane will expand.
Note: If you have additional dark corners, you may wish to add more manually
using an empty game object attach the component Light Probe Group moving one probe into
the dark area and one nearby in the lit area to reflect off each other.

When you have everything set up click 'Build' this can take quite awhile a suggestion is run it overnight. --- ### Lighting an Interior #### Overview[​](#overview "Direct link to Overview") The Sinespace platform provides virtual world creators with lighting tools that can create a wide variety of atmospheric spaces. The Sinespace platform provides virtual world creators with lighting tools that can create a wide variety of atmospheric spaces. There is no single right way to light a region, and getting the right result can take a few attempts. This guide uses the Mirage demo scene as an example of combining real-time and baked light types. [Download the Mirage scene](http://space-files.s3.amazonaws.com/sample-art/Mirage-Region.unitypackage) #### Baking and Lightmaps[​](#baking-and-lightmaps "Direct link to Baking and Lightmaps") Each light in a scene is either baked or real-time. Most light types, with the exception of area lights, can be either. Real-time lighting affects in-world performance. Baked lighting increases upload size. In the Mirage demo scene, the creator used a combination of real-time and baked lighting. ![Lightmap.jpg](/assets/images/lightmap-5cda865b83300a1e7ad6ba232c5407bc.jpg) #### Ambient and Directional Light[​](#ambient-and-directional-light "Direct link to Ambient and Directional Light") When you create a new scene in Unity, it has two light sources by default: * Directional light * Ambient light ##### Directional Light[​](#directional-light "Direct link to Directional Light") A directional light is an object in the scene that you can rotate like any other object. It casts shadows in the direction you rotate it. For the Mirage scene, the directional light has been deleted. Directional light is often used as sunlight in an exterior scene. In Mirage, shadows are cast by the point lights in each room. ![Directionallight.jpg](/assets/images/directionallight-c1b380e354871cb61b3f65bf5a8a1f09.jpg) ##### Ambient Light[​](#ambient-light "Direct link to Ambient Light") The ambient light has no source object in the scene. Modify it from **Window > Lighting** in Unity. In this scene, the ambient source is the skybox. The skybox color range informs the ambient light in the scene. You can also use a flat color source or gradient options. The skybox option works well in Mirage, but it may not fit every region. ![Ambientlight.jpg](/assets/images/ambientlight-5bc3fa09dfb023538c55895366c5c474.jpg) #### Adding Lights to a Scene[​](#adding-lights-to-a-scene "Direct link to Adding Lights to a Scene") You can add lights and light probes from **Create > Light** in the scene hierarchy. Keeping "light" in the names of your light objects makes them easier to find in the hierarchy. ![Createalight.jpg](/assets/images/createalight-854e03e42d3edcbccd096f813854dfa0.jpg) #### Area Lights[​](#area-lights "Direct link to Area Lights") Area lights are used in this scene to project different tinted light from a plane into each room. Area lights are efficient, but they do not cast shadows. They are baked only. The direction of the light from the plane is indicated by the yellow line. ![Arealight.jpg](/assets/images/arealight-f65dad2d8404c60062f2f767dbab43f3.jpg) #### Point Lights[​](#point-lights "Direct link to Point Lights") The hanging lights in the Mirage scene are mesh lamps on the walls and ceilings, with point lights attached. Point lights emit light in all directions over an area visible as a wireframe sphere. In this scene, the point lights are set to real-time and create dynamic shadows on avatars and other non-static objects. The hanging lights also have a halo component to provide a simple visual indication that they are light sources. The Mirage scene also contains one baked point light, called `CenterLight`. The creator used a wide-area baked point light because an area light on the ceiling would have weakened the shadows cast by the other ceiling and wall lights. ![Pointlight.jpg](/assets/images/pointlight-237d118dc43a407ed3ed97d8b70642f5.jpg) #### Spot Lights[​](#spot-lights "Direct link to Spot Lights") Spot lights project light from a cone point. In the Mirage scene, they illuminate the NPCs showcasing clothing items. They are set to real-time and project NPC shadows onto the back wall. ![Spotlight.jpg](/assets/images/spotlight-e6e66e9fd114e3b5edcacb31a062a0ec.jpg) #### Emissive Surfaces[​](#emissive-surfaces "Direct link to Emissive Surfaces") The light circle in the center of the main room uses meshes where the Standard Shader is set as emissive, making the mesh appear to radiate light. If the emission value is between 0 and 1, the mesh surface appears to be a light source but does not actually emit light. If one or more color channels are set above 1, the mesh surface emits faint HDR light. This can work well for LEDs and small light piping, and can contribute to light bounce off shiny surfaces. Emissive surfaces are only applied to static objects and only for baked lighting. note Emissive surfaces may generate artifacts on materials with detail maps when viewed in WebGL. ![Emissivesurfaces.jpg](/assets/images/emissivesurfaces-57b009e65de454409154b0c36d8bc80c.jpg) #### Light Probes[​](#light-probes "Direct link to Light Probes") Light probes sample the combined lighting in the scene and let moving objects, especially visiting avatars, be lit by baked light sources that would otherwise only affect static scene components through lightmap textures. Place as many or as few light probes as your scene needs. Aim to place them where different light sources overlap. In this scene, the creator focused on light probes at head height, especially around the intense lighting in the fashion studio. note You can toggle light probe visibility from the Gizmos menu above the Scene view. ![Lightprobes.jpg](/assets/images/lightprobes-0f6764d43066dddf45239d633167d1ac.jpg) #### Baking the Scene[​](#baking-the-scene "Direct link to Baking the Scene") Once your light sources and light probes are laid out, and all static objects that form the fabric of the scene are in place, bake the scene before submitting it to the server. Baking is triggered from the **Build** button at the bottom of the Lighting window. It may take a while to complete, and it takes longer when the baked resolution is higher. Unity defaults to 50 texels per unit; this scene used 20 and could probably have gone down to 10 without a significant visual change. After the bake completes, Unity creates lightmaps for your scene. These are uploaded automatically when you submit the scene to the server. The lightmaps are then blended with the scene textures to create the final look. When you bake the scene, Unity also applies light information to light probes and reflection probes. You can also bake ambient occlusion and reflection probes as part of the same process. ![Bakinglights.jpg](/assets/images/bakinglights-d6ac7e10a095ccbebca972b3486e3791.jpg) --- ### Management #### Overview[​](#overview "Direct link to Overview") Preview and Live Servers When you upload a region, the region will go through the upload process. ##### Preview and Live Servers[​](#preview-and-live-servers "Direct link to Preview and Live Servers") When you upload a region, the region will go through the upload process. You can check on it's progress on Curator. When it's uploaded, it will be on our preview server. Regardless of your subscription level, you can upload as many regions as you want to the preview server. Once on the preview server you can preview your region. If you are happy with it, you can 'Send it to Review' via curator and it will be reviewed by our review team. This review is to ensure the maturity ratings are appropriate and that nothing in the scene could crash the servers or severely impair performance for other users. If you have a Level 5 subscription you can bypass this manual review and push directly to the live servers yourself. Your subscription level determines the number of regions you can release concurrently on the live server. ##### Region Info Panel[​](#region-info-panel "Direct link to Region Info Panel") When you are logged in to any region you can click the minimap in the top right corner to open the Region info panel for that region. ![Region info.png](/assets/images/region-info-3c8c4404ee4a9ba20d2934dabd2a5205.png) ##### Region Access[​](#region-access "Direct link to Region Access") If you are the region owner you can then modify the access permissions; ![EditRegionInfo.png](/assets/images/editregioninfo-c193b95e01ed5e30e4cd3032b5f35b63.png) You can set the region to be public, limited to your friends or limited to specific individuals who you approve. ##### Approve Users for Region Access[​](#approve-users-for-region-access "Direct link to Approve Users for Region Access") Any user can request access to one of your private regions; ![500px-Applyaccess.png](/assets/images/500px-applyaccess-604d0d817803aa9e065741b782dda5e2.png) You can approve or reject their application. ##### Members[​](#members "Direct link to Members") In the members panel you can see who currently has access to the region and you can modify their permissions on an individual basis. ![600px-Region info 3.jpg](/assets/images/600px-region-info-3-f630e015417580ea27cb5313c670833f.jpg) ##### Multiple Region Management[​](#multiple-region-management "Direct link to Multiple Region Management") Your subscription level sets the number of concurrent regions you can deploy on the live servers. ![Region levels.jpg](/assets/images/region-levels-52dc04f738b86e83edece2cddae9c7e8.jpg) You can upload as many regions as you want to, and then enable or disable each region to set which ones are live at any time; ![Regionlist.png](/assets/images/regionlist-eac66d9513676b63a3b8d6b21d6c09da.png) --- ### Navigation #### Overview[​](#overview "Direct link to Overview") Navigation You can walk around Space by clicking the ground in front of you, or using arrow keys/WASD to move and rotate. #### Navigation[​](#navigation "Direct link to Navigation") You can walk around Space by clicking the ground in front of you, or using arrow keys/WASD to move and rotate. If the region using default settings, you can fly by clicking F then use E to hover up C to hover down Or Page Up / Page Down Then use arrow keys or WASD to fly around. 1. Camera Controls Hold your right mouse button down and move your mouse to look around. Use your mouse wheel to zoom. 1. Run/Fly Fast Hold down SHIFT to run instead of walk when you use WASD or arrow keys. You will also fly faster if you hold down SHIFT. --- ### Navigation bake #### Overview[​](#overview "Direct link to Overview") The NavMesh function in Unity can help you define your region where is walkable and where is not, so if you have an auto-walk function for player or NPC, it can automatically calculate the routes. The NavMesh function in Unity can help you define your region where is walkable and where is not, so if you have an auto-walk function for player or NPC, it can automatically calculate the routes. If you are interested in how to fully use the NavMesh function, please check [official tutorial of Unity](https://unity3d.com/cn/learn/tutorials/topics/navigation/navigation-overview?playlist=17105%7Cthe). Here, we will only introduce some basic methods. As an example, I created a region with some simple objects as obstacles. ![Global.jpg](/assets/images/global-335a2329bad9e47227af2f8d5022f64d.jpg) ##### Create a NavMesh Map[​](#create-a-navmesh-map "Direct link to Create a NavMesh Map") First, Click the menu Window -> Navigation to call out the Navigation window(In Unity 2018, it's in Window -> AI -> Navigation). There are four tabs in Navigation Window: Agents, Areas, Bake and Objects. The Agents tab is a place to record profiles for different parameters, when you attach Nav Mesh Agent component to a character, you can choose the agent profile you set in the agents tab. ![Agents.jpg](/assets/images/agents-4be9a58f2d8c5a483e2d1c3bdfa4738c.jpg) The Areas tab is for define the layers of navigation. There is already 3 built-in layer: Walkable, Not Walkable and Jump. You can always add new layer if you need. The Cost defines whether the layer is hard to walk or not -- more cost, much harder. Normally, the Auto-walk will always choose a path with lower cost. ![Areas.jpg](/assets/images/areas-4f44cf3a2ac0afaaaa7c7f0908a049e9.jpg) The Object tab is to set the navigation parameter for the objects in the scene. The 3 filters, All, Mesh Renderers, Terrains can help you to find the objects, and if we need to set an object walkable or not, pick the checkbox Navigation Static, then choose its layer. If you want set it jumpable, for example: jump across a gap between two platform, of jump down from somewhere high, you should also pick the Generate OffMeshLinks checkbox then choose the Jump layer for Navigation Area. ![Object.jpg](/assets/images/object-4dd643fcc0122d43ce8702ec6f3f07e2.jpg) The Bake tab includes all detail settings here. The Agent Radius defines the width of character and how narrow the path it could pass. Agent Height stands for the height of character, so if there is a height limitation area, the character shall not pass. Max Slope defines the maximum angle the character can move on, and objects lower than the step height will not be considered as an obstacle. Drop Height is the maximum height which the character can jump off, and jump distance is a horizontal distance which the character can jump across. ![Bake.jpg](/assets/images/bake-2c78f799a7b40baf74b3a94cf63da967.jpg) When all the settings are done, you can click the Bake button to generate the NavMesh Map. When it's complete, the Scene window will display the Navmesh map. ![NavMesh.jpg](/assets/images/navmesh-7307fae1b03db606d7c947998552e812.jpg) The NavMesh jumpable with off-Mesh links will have an arrow and circle like this: ![Jumpable.jpg](/assets/images/jumpable-8261a2922eb0b32c4e0cafc4680b0dd0.jpg) ##### Create a NPC moves in control of NavMesh[​](#create-a-npc-moves-in-control-of-navmesh "Direct link to Create a NPC moves in control of NavMesh") You will need a lua script to set an object moving through the NavMesh. Here, I'll show you a simple example. First, create a capsule as the character we want to move in the baked scene, then add the component "Nav Mesh Agent" to it. ![NavMeshAgent.jpg](/assets/images/navmeshagent-cb671128dcc7d3d6087065090c304ced.jpg) Choose the profile you set in the Navigation window, and set other parameters as you want or just leave it as default -- if you wonder each parameter is for, check the link of tutorial above. Create an empty object and move it to the destination you want to set for the move. Change the object's name to something easy to find in script, like here, I name it as "dist". ![Dist.jpg](/assets/images/dist-f9ab17ab52a0955c7af608d85d8a1302.jpg) Now add the lua script to the capsule. Add the "Scripting Runtime" component to it, then write the code like the image below: ![NavMessScript.jpg](/assets/images/navmessscript-3ec82d669b584c29f3adbe2d75104559.jpg) *The line "Space.log(agent);" isn't necessary, it's only a log to make sure the script is working.* You can add an clickable activator to active this script when click the capsule, or it will start moving automatically. ![NavMeshGIF.gif](/assets/images/navmeshgif-78f22b040478c5fbfd112727f5fcee05.gif) Here is a GIF which shows you the result of NavMesh move. --- ### Occlusion bake #### Overview[​](#overview "Direct link to Overview") Occlusion Culling is a Unity function which can disable rendering of objects when they are not currently seen by the camera if they are occluded by other objects, which can save time from rendering. Occlusion Culling is a Unity function which can disable rendering of objects when they are not currently seen by the camera if they are occluded by other objects, which can save time from rendering. You can get the details of advanced operation from the [Documentation](https://docs.unity3d.com/Manual/OcclusionCulling.html%7CUnity). Here we only use a simple example to show you how to use this function in Sinespace. ![Occlusion overview.jpg](/assets/images/occlusion-overview-f3ffea7c1ccfec650de8f689a0c1639d.jpg) This is the overview of a new created region. You can see there is a big cuboid and a small cube, where the small cube is occluded by the big cuboid from the view of camera, and the big cuboid is combined by 3 big cubes. Now in menu, click Window -> Occlusion Culling to open the Occlusion window(In Unity 2018, it's Window -> Rendering -> Occlusion Culling). There are 3 tabs in this window, object, bake and visualization. In Object tab, you can set objects Occluder static and Occludee static. Occluder static means this object can occlude other smaller objects which has occludee static parameter checked. ![Occlusion object.jpg](/assets/images/occlusion-object-ba853dcff48eff4c8041cea2aa950fd0.jpg) You can also use the option "static" in the right-top of the Inspector window. Set the objects Occluder static and Occludee static here: ![Occlusion set static.jpg](/assets/images/occlusion-set-static-45b4365c75f46506c8c3225a637c0cea.jpg) It's same as the operation above. Choose the method which you prefer. When you finished setting the objects occluder or occludee, you can bake the scene to calculate the occlusion data. ![Occlusion bake.jpg](/assets/images/occlusion-bake-07380a7895ede84a9789bd553aaa4dfb.jpg) The default settings here normally is enough for most situations. If you want to adjust them, check the Unity documentation(link mentioned above) for the details of each parameter. The occlusion volume will show after bake. ![Occlusion baked.jpg](/assets/images/occlusion-baked-75a01d9db03f90cfa30cbec1a8efb77d.jpg) Then you can test the result in Visualization tab, if every thing is correct, when you focus on the camera, the small cube behind the big one will be invisible. ![Occlusion visualization.jpg](/assets/images/occlusion-visualization-e9532e0dd130693a23f34658ec79772d.jpg) A region with occlusion culling is complete. Remember delete the camera for test before uploading your region. Does it really work in Sinespace? Yes, the occlusion culling in your region will be the same as the result you tested in Unity. It may be hard for normal user to find it out, so here I present some images from the developper: ![Occlusion gameview.jpg](/assets/images/occlusion-gameview-8f66b20a319e3f53842b9e01939a98b3.jpg) ![Occlusion sceneview.jpg](/assets/images/occlusion-sceneview-5e0684130aa25d77afe3eac2de978fcc.jpg) The image above is the game view of the client. And switch to the scene view(image below), you can see the small cube is invisible in visualization mode, proving the occulision culling does work with Sinespace. If we move around, to the side of one big cube, where we can see the small one, like in the image below: ![Occlusion sceneview2.jpg](/assets/images/occlusion-sceneview2-922dfc61819d03fdea029482cd103cf4.jpg) As you can see, the small cube can be seen now, but 2 other big cubes are invisible because of occluded by the one close to the Avatar. As a conclusion, if you want to make your region more friendly to low-end PC or webGL, mobile platform, use occlusion culling to your region -- just set the static objects occluder and occludee, bake it with default settings, that's all. --- ### Pets #### Overview[​](#overview "Direct link to Overview") \== IMPORTANT!!! == THIS IS A QUEST FOR WILDLANDS REGION ONLY - PETS ARE ONLY AVAILABLE TO USE WHILE IN WILDLANDS REGION Obtaining a Pet You can obtain a pet by completing Joen's qu #### Obtaining a Pet[​](#obtaining-a-pet "Direct link to Obtaining a Pet") You can obtain a pet by completing Joen's quest in Wildlands, buying eggs from vendors in Wildlands and you can also buy rare species in Neon. After you have obtained a pet, you can see all of their details under the PETS button at the bottom of the screen. Please note pets are only active while in the Wildlands region. #### Feeding your Pet[​](#feeding-your-pet "Direct link to Feeding your Pet") Pets will get hungry and need feeding. You can feed your pet by finding food for them, or buying the food from vendors. Click on the PETS button, click the pet you want to feed and click the FEED button to give them food. Each species of pet will eat different types of food, for example, Parricans eat berries. #### Aging your Pet[​](#aging-your-pet "Direct link to Aging your Pet") Your pet can be aged from an egg into an adult by using a Maturation Potion. Under the PETS button, click on the egg you want to age, click on USE ITEM and click on Maturation Potion. The potions can be bought at a potion vendor in Wildlands. #### Mutagems[​](#mutagems "Direct link to Mutagems") Mutagems can be bought at a Mutagem vendor in Wildlands.Mutagems are used to change the base genetics of your pet. Mutagems can be used by clicking on the PETS button, clicking on the pet you want to change, and clicking on USE ITEM and then clicking on Mutagem. There are different types of Mutagems: Coloured- These gems can change your pets appearance, for example, buying a Huge Pink Mutagem gives a higher chance of changing your pets colour to pink. Colourless - Colourless mutagems will remove a colour from your pet and return it to its original base colour. Different types of colourless mutagems affect different parts of your pet. Shaped - Shaped mutagems can help change the size or weight of your pet. Rare special shaped Mutagems can change certain pet traits, such as wing length or eyebrow length. #### Habitats[​](#habitats "Direct link to Habitats") Your pets will need a place to live and breed. These are called Habitats, and you can buy these from a Habitat vendor in Wildlands. You can place your pet in the Habitat by clicking on the PETS button, clicking on the creature you want to move to the habitat, and clicking on PLACE INTO HABITAT. If you have a higher end habitat, your pets will be automatically fed whilst in the habitat using the inbuilt autofeeder. Habitats also serve as a place for breeding; If you place an adult female and male of the same species into your habitat, they will breed and give you new eggs! #### Breeding[​](#breeding "Direct link to Breeding") Your pets are breedable! If you want to breed your pets to give you new eggs, you need to first click on the PETS button, and find a male and female pet you want to breed. They must be the same species to breed. Click on the male, and add him to a habitat by clicking PLACE INTO HABITAT. Do the same for the female. Make sure they are both adults, otherwise they cannot breed, and also make sure they are fed. Give it a little while, and you will have a new egg under the CREATURES button in your pet libary! #### Equipping your pet[​](#equipping-your-pet "Direct link to Equipping your pet") You can equip your pet by clicking on the PETS button, clicking on the pet you want to equip and click the EQUIP button. This will allow your pet to visible in world right next to you, and follow you around! If you want to unequip your pet, click on the PETS button, click on the pet you have equipped, then click on UNEQUIP. #### Releasing your pet[​](#releasing-your-pet "Direct link to Releasing your pet") If you don't want to keep a particular pet anymore, you can release your pet into the wild. To do so, click on the PETS button, find the pet you want to release, click on them and then click on the RELEASE CREATURE button. A window will appear to ask you whether you want to release pet or keep pet, just in case you change your mind. #### Pet Battle[​](#pet-battle "Direct link to Pet Battle") Your pet can be placed into combat! Find an arena (These are marked by vendors with crossed swords above their heads; One is in Wildlands and one is in Sol) and click on the vendor. They will ask you if you want your pet to fight. Once in combat, you can choose different types of attacks by clicking the attack buttons on the left hand side of the screen. Your pets health and stamina will be displayed underneath the attack buttons, and the opponents health and stamina will be displayed on the right hand side of the screen. You will gain XP from the fight if you win or lose. --- ### Platform Settings #### Overview[​](#overview "Direct link to Overview") Attention: This is now listed under the Scene Settings in Unity Supported platforms The platform settings allow you to fine tune your region for each platform you want to publish to. Attention: This is now listed under the Scene Settings in Unity ##### Supported platforms[​](#supported-platforms "Direct link to Supported platforms") The platform settings allow you to fine tune your region for each platform you want to publish to. Space currently supports; * Standalone - Desktop application, PC or Mac * Mobile / tablet - Android or iOS * WebGL - Chrome, Explorer, Firefox and Edge * Console - Sine Wave Entertainment is an accredited developer for Xbox and Playstation. The company is planning to release on these platforms later in 2017 after building a user interface for game controllers. \\ ##### Settings[​](#settings "Direct link to Settings") The default settings are designed to work for most regions. Scene adjustment * Remove lightmaps / light probes / reflection probes Removing lightmaps and probes can significantly reduce download speed but will also impact on the runtime performance. More information; Lightmaps Light probes Reflection probes * Static bake meshes / colliders Ticking these boxes will prebake data before export. This improves loading performance but the region download will be bigger. More information; Static bake meshes Static bake colliders * Strip occlusion / navigation data Occlusion data holds information about what areas are visible from other areas; it allows the viewer to make intelligent decisions about optimising a scene, however it can add several mb of size to both runtime memory use; and download size. Keeping it improves performance but can result in higher memory use in big scenes. Navigation data is used for showing waypoints, and moving NPCs around in a scene; it uses a little bit of extra memory, and can be stripped out if you are under severe memory pressure. Texture size reduction * Max texture resolution All textures will be reduced to a maximum of the defined size for each build. * Texture reduction levels Reduces textures all by a multiple of the original, in line with Max texture reduction above. So; if your scene contains large textures at 1024x1024 and you set the max texture reduction to 512 those large textures will be reduced by a factor of 4. If you then set Texture reduction levels to 1, smaller textures in your scene will also be reduced by a factor of 4; so a 512x512 texture, which otherwise would have been unchanged by the Max texture reduction, would also be reduced by 4, to 256x256. If you set the Texture reduction level to 2 it will multiply the Max texture reduction scale by 2; so in the case above reducing the smaller 512x512 texture by a factor of 8, to 64x64. * Normal reduction levels This will apply a further multiplicative reduction on normal maps on top of the reduction already applied by the Texture reduction level above. Texture compression * Allow crunch / Crunch level Allows JPEG compression to be added to all textures in addition to DXT compression. This will degrade the quality of your images as the compression is lossy; but significantly reduces download filesize. It does not improve runtime memory size except during loading. Crunch level runs from 0 (very lossy) to 100 (lossless). * Compress textures This applies a further quality reduction, comparable to the quality slider in Photoshop when saving a jpeg file. * True color As 16 Interprets images stored as 'True Color' to 16-bit colors. This applies compression to the colors, without introducing the blurriness / artefacts that DXT compression can introduce; at the expense of being slightly larger. With this ticked, any image with 'True Color' compression, will be packed at 16 instead of 32-bit on this platform. Audio settings * Force audio to mono Converts stereo files to mono for that platform. * Audio bitrate This is a percentage field. So whatever the bitrate of your original files, you can reduce by X% for each of the different platforms you publish to. For instance a set of 128 bitrate original files, left at 100% in the Standalone build can be reduced to 64 in Mobile and WebGL builds by setting this field to 50. --- ### Portal #### Overview[​](#overview "Direct link to Overview") Made of light foam or fibers stitched to the underside of the ticking, it provides a tender surface texture to the mattress and could be found in various degrees of firmness. Made of light foam or fibers stitched to the underside of the ticking, it provides a tender surface texture to the mattress and could be found in various degrees of firmness. When you love some extra consolation, this is able to be a wonderful choice for you as an extra layer of upholstery is added to your mattress for a comfortable and cushiony feel. For an opulent, restful sleep, you need a excessive-quality and supportive mattress from a brand you can belief. And though it could trap warmth for some, the mattress sleeps comparatively cool in comparison with other all-foam beds. Sam's Club presents you a [Learn This..](http://wuguu.com.tw/comment/html/?0.html) variety of choices when it comes to the size of mattresses. --- ### Post FX #### Overview[​](#overview "Direct link to Overview") You can use PostZone(Post Processing)Component to add/change postFX in your region. You can use PostZone(Post Processing)Component to add/change postFX in your region. PostZone can be applied to a part of the region or the entire region. ##### Adding PostZone[​](#adding-postzone "Direct link to Adding PostZone") To create a PostZone, create an empty object in your scene, then click on add component, search and select PostZone. If you want part of a region to have different postFX, then add a box collider to the EmptyObject with PostZone and size according to the area needed. For example you can have different postFX for interior and exterior areas of a region by adding different postZone and sizing the collider to the size of the area. ##### PostZone Technical Details[​](#postzone-technical-details "Direct link to PostZone Technical Details") You can learn more technical Details on Post Processing [here](/sinespace-sdk/scene-authoring/post-processing.md). --- ### OpenSimImport #### Overview[​](#overview "Direct link to Overview") This workflow imports regions created and archived with Open Simulator into a Space project. It is intended for advanced Unity, Space, and Open Simulator users. #### Before you begin[​](#before-you-begin "Direct link to Before you begin") **Level:** Advanced Unity/Space, advanced Open Simulator operations. **Goals:** Import regions created and archived with Open Simulator into a Space project. **Requirements:** The utility this workflow is based on is a Windows-only program at this time, so a reasonably resourceful Windows desktop is required. You will also need a region archive created with an Open Simulator instance to import into your Space region. warning The import utility software described here was not produced by the Sine Space team, and is not officially supported. Your mileage with this software may vary β€” use at your own risk. This workflow description is provided for guidance only. Obtain any support required for the utility from its authors. There are two primary steps to this workflow. #### Opening the archive[​](#opening-the-archive "Direct link to Opening the archive") First visit the site for [OARConv](http://www.nsl.tuis.ac.jp/xoops/modules/xpwiki/?OAR%20Converter), download the software, and prepare it for use on your Windows desktop. Run the executable and browse to your archive file. Be aware that simply browsing to the OAR file starts the conversion by unpacking the Open Simulator archive. You will be guided through the appropriate modal interfaces to select or create folders for this operation; the defaults are reasonable. Wait for this operation to complete. You now have the dataset from the Open Simulator archive in a format ready for conversion to DAE. You do not have to import the entire region β€” there is an archive browser and object previewer in the OARConv interface. Lastly for this step, select all the content you wish to convert and begin the conversion. This produces DAE files suitable for import to Space, in the target folder prepared earlier. Once that process is complete, you are ready to proceed to the next step: importing the DAE to Unity/Space. #### Importing the archive[​](#importing-the-archive "Direct link to Importing the archive") OARConv produces two folders of assets as its output. One contains all the objects that were collideable in the original simulator; the other contains all the objects that were phantom. It is recommended that these be imported separately, as follows: * Create two empty game objects in your hierarchy; name one `phantom` and one `nonphantom`. * Drop the folder contents from each of the OARConv folders into these empty game objects accordingly. * Select the contents of the non-phantom folder in your project hierarchy, and in the Inspector click **Generate Colliders**. This will leave the two sets of objects distinct in your hierarchy (though not in the scene). Unity will grind a while β€” depending on the size of the import and the capabilities of your hardware, it might be a *while*. In the meantime, here are a few things you should know about the completed import operation. Unity/Space is not Open Simulator and vice versa, so it is to be expected that there is not a 1:1 correspondence between the objects in the respective regions. There will be some cleanup work that needs to be done, and some things to watch out for. Some of these will be fairly painless while others will require attention to individual objects by hand. A lot of the cleanup will be graphic, and some of it will be structural. Most of the graphic settings will involve the adjustment of textures. There is also the issue of naming: the OARConv tool does not use the names of the Open Simulator assets in many cases, and will use UUIDs instead. One thing to look out for is large or duplicated files. Even similarly presented objects will not share materials, so the roughly converted region produced by the OARConv process will tend towards bloat. Additionally, terrains are imported oddly, and the meshes and materials produced for them can balloon considerably. Explore the interface of the OARConv tool and become familiar with it. While it is not a perfect tool, it can be useful and effective at getting content moved from one platform to another. --- ### Troubleshooting #### Overview[​](#overview "Direct link to Overview") \=Troubleshooting= Materials An item is bright pink \* This implies a problem with your material; check: \*\* The material has a shader, selecting the material may show !!MISSING SHADER!! \=Troubleshooting= #### Materials[​](#materials "Direct link to Materials") ##### An item is bright pink[​](#an-item-is-bright-pink "Direct link to An item is bright pink") * This implies a problem with your material; check: \*\* The material has a shader, selecting the material may show !!MISSING SHADER!! where the shader should be. \*\* The shader works on all our destination platforms, if you're using a custom shader, check for warnings - for space, all shaders need to work with all destination platforms. (If your shader does not work on a particular platform, we recommend using the 'Fallback' statement to fall back to a standard shader, or use Fallback Off, and the item will simply not render.) ##### The item is pure black and unaffected by lighting[​](#the-item-is-pure-black-and-unaffected-by-lighting "Direct link to The item is pure black and unaffected by lighting") * This usually implies a shader bug (NaN and Infinity values are often rendered as pure black by most GPUs) =Uploads= #### My Region Fails Always[​](#my-region-fails-always "Direct link to My Region Fails Always") * This may be a bug with the processor, we'll be looking into it anyway * Large regions may hit a maximum processing time limitation (currently set to 90 minutes.) --- ### Room Floor System #### Overview[​](#overview "Direct link to Overview") You can use the room floor system to create a region you can edit from inside Sinespace. You can use the room floor system to create a region you can edit from inside Sinespace. This is mostly used for making home regions where users will want to decorate. 1. Have your region set up in Unity. Click on GameObject at the top of Unity and then click 'Create Empty'. 2. Change the transform of the empty object to the position of 0,0,0 if it is not already set to that. You can also rename the empty to something like 'Room Floor' to make it easier to find in the hierarchy. 3. In the hierarchy, click on the empty object you just created, and in the Inspector window on the right, click on Add Component. Search for 'Room Floor' and add it. You will see this in your Inspector window. 4. Add a name into the Name box. This name will be visible to users buying your template if you decide to sell it in the Shop. 5. Add a description into the Description box. This description will be visible to users buying the template if you decide to sell it in the Shop. 6. In the Furniture Quick placement, change the size to the number of floor areas you want in your region. For one area such as one room, change the size to 1. If you are making a house or anything else with levels, you will need to change the size accordingly. The collider to put here will usually be on the 3D object you used as the floor; You can simply drag the whole 3D object from the hierarchy to this box, and it will automatically add the collider. 7. Create another empty object and name it camera target. If you see a dropdown arrow next to room floor in the hierarchy, the camera target object is parented to it. You need make this a single object by dragging it down. 8. Once this is unparented, make sure in the Transfrom under the Inspector window that the camera target is set to the position of 0,0,0. This is used so that the bird eye camera can look down on this object, making it easier for users to edit from top view. 9. Drag the camera target object into the Focus box under Camera and Focus. You can leave the Default Zoom from Focus as it is. 10. The Constrain Focus to Area is an optional setting. If you want to constrain the camera to an area, you will need to add a box collider above the ground collider. To add a box collider, make a new empty object and name it Constrain. Drag this collider into the Make sure it is above the ground collider and not intercepting it. This collider will go around the area, as shown in this example. If you have multiple levels or multiple buildings, you can add more Room floor components to define different areas. These steps are also covered in our [Private Room Template](https://www.youtube.com/watch?v=RYEmB-6o1XE\&t=226s) tutorial video. 11. Subletting allows you to share the space with other users. This will be a feature in the near future. 12. Placement Restrictions allow you to restrict placement of items in certain places. If you check this box, and then enter a number in the Size box, this will give you element box with a Collider. For example, if you have built a house with a roof on it, and you don't want users to be able to place items on the roof, you can drag in the roofs' main collider here, and this will disallow placement of items. You can set up multiple areas for restricted placement by changing the Size (e.g from 1 to 5). ###### Configurable Buttons[​](#configurable-buttons "Direct link to Configurable Buttons") There is an additional (optional) setting for use within the Room Floor system which allows you to set up configurable buttons. These configurable buttons allow you change certain aspects of the room, such as allowing you to open and close curtains, change from night to day and other settings. As this is a complex setting, you can see our video tutorial for the configurable buttons [here](https://youtu.be/klEaPKcBoOk?t=118). ###### Lighting Controls[​](#lighting-controls "Direct link to Lighting Controls") The lighting controls are another optional setting you can use in your room template. The lighting controls will add a button under the Options menu in Edit room, so that the user can change the color and intensity of lights if they want to. For this to work, you need to have set up your lighting model (e.g. standing lamp or table lamp) with a point light or another sort of light. You can do this buy adding the light as a child object to the light model. The Lights size is the number of sets of lights you want to affect. If you have standing lamps for example in one area, you can have these as one group of lights, and change the Lighting size to 1. If you want to change another group of lights in a different area such as outside as well as the lights in the other area, set this to 2. Make sure you click on New next to the Network ID box. This can be changed manually at another point if need be. The Affected Lights is where you will need to drag in the lights from the hierarchy. For example, if you have set the Light size to 1, and in this light group you have two candles, you will need to drag the light source from each of these candles into the slots. The light source is the Spotlight, Point Light or Directional Light. The Colour setting allows you to set the lights as colourable, so users can change the color of the lights in their home region. To make the lights colourable, check the box. If you don't want to make the lights colourable, the light color will stay locked to the colour under the Light Source settings. You can see this default color by clicking on the Spotlight, Directional Light or Point Light. If you are making them colourable, set the Default Colour on the Room Floor component to something close to the light source default. Once in-world, users can change this colour to whatever they want. If you want the user to be able to change the Intensity of the lights, you can check the Show Dimmer box. This will add a Brightness slider to the Lights option in-world. The Default Intensity will be the Default Intensity number on your light source. You can then add a Minimum Intensity and a Maximum Intensity to the lights which the users will be able to toggle between using the Brightness Slider. The Day/Night cycle option allows you to have the lights turn off during the day and turn on at night when checked. ###### Material Controls[​](#material-controls "Direct link to Material Controls") The Material Controls will add a button under the Options menu in the Edit room system to allow users to change materials on the walls or floors of their home region. They will only be able to change the material if they own material packs bought from the in-world Shop. You can make your own material packs as well to sell in the Shop. To make the material interchangeable, add in a new Network ID. If you are making it so the material on the floor can be changed, name this as Floor so it's easily recognizable in-world on the Options menu in the Edit Room system. If you are setting it up so the material on the walls can be changed, name this as walls. If you are doing both, change the Size to 2, and name one Floor and one Walls. The Associated Materials is where you drag in the mesh for the floor or wall. If you have multiple walls or floors you want to make the material interchangeable on, set the Size to however many you have, such as 2 for 2 walls e.t.c ###### Built-in Objects[​](#built-in-objects "Direct link to Built-in Objects") This option allows you to have furniture already in the Room Inventory when you upload it and sell the home template in the Shop. These furniture items can then be placed in the region, but can't be put back in the inventory. Note: This is an upcoming feature which will be released soon Set the Size to how many pieces of furniture you are placing in the region. For example, if you are uploading the region with a bed and sofa already placed, change the Size to 2. These furniture items will In the Element box, drag in the furniture item which contains a room furniture component and a virtual good component. When you upload the whole room template, these items will show in the Edit Room inventory. ##### Uploading the Room[​](#uploading-the-room "Direct link to Uploading the Room") To upload the room template to the Shop, add the Scene Settings component by clicking on Sinespace at the top of Unity, and choose Scene Settings. Once they are added, you will see a Virtual Good component and the Scene Settings component in the Inspector window. Fill in the Virtual Good component Basics tab with the Type set to Region, then the Category set to which ever category is appropriate. Fill in the rest of the virtual good with all of the information, but don't submit the region yet as you will need to fill in the Scene Settings. For more information on how to fill the Scene settings, please visit this [page](/sinespace-sdk/regions/export-settings.md). Once it is all filled in, you can then Submit your region. You can check on the upload process at curator.sine.space. --- ### Room System #### Overview[​](#overview "Direct link to Overview") Under a revision and will be up shortly. The room system allows the editing of a region while logged in-world. Under a revision and will be up shortly. The room system allows the editing of a region while logged in-world. #### Editing your Room[​](#editing-your-room "Direct link to Editing your Room") To edit your room, go to your room by clicking on the 'Home' button at the bottom of the screen. Once in your room, click on the 'Edit Room' button. This will bring up the Edit Room UI. The Edit Room UI has a ton of different tools. 1. Inventory This is where all of the furniture items you have are stored. You can click on a item in the inventory, and this will be spawned in the room. 1. Select This will select the furniture item you click on in the room. 1. Rotate (2D) This is the first rotate tool along the top, it'll rotate easier to grab handles focusing more on overhead rotation, allowing for stuff like furniture placement to be rotated, without necessarily grabbing the object in 3D and rotating all over the place randomly. 1. 3D Move This is your standard translate tool, you can hold CTRL while moving to move along a 1m grid. 1. Rotate 3D The 3D rotate tool lets you rotate both in the 3D space, using the X,Y and Z handles, and also lets you rotate in screen space. If you hold CTRL while rotating, it will look changes to a 15 degree angle. 1. Scale Scale sizes items up and down if you scale using the middle white box on the gizmo, or, you can grab the other handles individually to scale along the X,Y and Z axis. If you hold CTRL while scaling, you can lock the scaling to multiples of 100. 1. Camera There are three camera settings: * Ceiling - This will lock the camera to the overhead ceiling that is built into the room by the room designer. If you use the arrow keys, you can pan the camera, or you can move the mouse cursor to the edge of the screen. * Fly Thru - This is a free moving camera. Hold right click, and use the W,A,S,D,E and C keys to move the camera about manually. For building scenes this is often the best mode to use. * Avatar - This will use the normal camera view behind the avatar. 1. Snap Snap controls how the object will be moved underneath you - this is a on/off toggle. When there is a blue tick, this indicates that snap is on. 1. Node If the furniture has 'snap nodes' built in, the object will lock together as the designer intended. * Align\*\* Align is defaulted to be switched off, but if you turn it on, when you're dragging or placing furniture, this will try to align objects to their nearest other object (or scenery component). This is useful if you want to place a sofa in line with a wall. 1. Coordinate Space if this is set to global, the widgets on the movement/rotation/scale tools, will be aligned towards the scene; so the 'Y' axis will always point upwards vertically off the ground. If you turn it to local mode, it'll be pointing towards the rotated upwards on that model, so if you rotate the model, the widgets will point in different directions. 1. Coordinate Origin This will mean that the gizmos will be emitted from the center of the mesh. The alternative mode, Pivot, which is the pivot point defined in the object, will set the gizmos to the objects pivot point. 1. Design' This is where you can switch to a different template for your room. You can buy new templates in the Shop under the Room tab. Note, when you swap storefront, it will erase the contents of your room You may instead, want to make a new region (from the main UI, click 'Home', then 'Create new region'), and edit in there - additional regions are free. 1. 'Material This is where you will see a list of all the material you have purchased from the Shop. Material can be bought from the Shop under the Furniture tab. You can click on the Material you want to use, and it will show on the floor or ceiling, depending on which one the material was made for. 1. Lights The lights button lets you control lights embedded in the region - set their colour or change their brightness. 1. Options the options button is a free-form area for creators to embed configurable options; such as 'shutters down' or 'door open/closed', etc. What the items are here here for example shutters, is defined by the creator. 1. Switch This allows you to switch from one area in a region to another, so you can place furniture in different parts of the region. 1. All Objs This will show you a list of all the objects you have in the region. 1. Save We don't save by default, so this is worth noting (we'll add a popup in a future viewer if it isn't in there already). The save button is used to save your changes, but if you don't like what you've done, you can logout and come back, and it'll return to how the region looked before you edited the room. 1. Undo This will undo the last change you made. 1. Redo Redo will redo the last change you undid. 1. Duplicate This will duplicate the object you have selected. 1. Delete This will delete the object you have selected. 1. Deselect This will deselect the object you have selected. #### Placing Furniture[​](#placing-furniture "Direct link to Placing Furniture") To place furniture, all you have to do is click on the furniture object in the inventory, and it will spawn in the region. You can choose to use the 'Switch' button if you want to place the furniture in a different area of your region. Once the furniture has spawned in the region, you can move it around with the above mentioned tools, and decorate as much as you want! There are a couple of shortkeys to use whilst placing furniture;First up - the alt key: if you're holding the alt key, the furniture will place on the closest surface below the cursor, if you do not have the alt key pressed, it'll place it on the floor instead. By default, every room has a list of placable surfaces in it, defined by the template creator. This may not be optimal - if you're placing something on top of a table for example, then you want to hold the alt key so they align. If you hold down Shift while placing, it'll also ignore the Snap and Align modes, as if they're switched off. #### Shortcut Keys[​](#shortcut-keys "Direct link to Shortcut Keys") Here is a list of all of the shortcut keys for the edit room tool: * W\*\*: Pressing the W key will switch the mode to Move. * E\*\*: Pressing E will switch the mode to Rotate. * R\*\*: Pressing R will switch the mode to Scale. * CTRL+LMB\*\* (Left mouse button): This will snap the selected object to grid. * CTRL+Z\*\*: This will undo the last action. * Shift+Delete\*\*: This will delete the selected object. --- ### Scenes #### Overview[​](#overview "Direct link to Overview") In Unity, Scenes are where you put all of the objects of your game. In Unity, Scenes are where you put all of the objects of your game. They can be used to create a main menu, individual levels, and anything else. Think of each unique Scene file as a unique level. In each Scene, you will place your environments, obstacles, and decorations, essentially designing and building your game in pieces. When you create a new Unity project, your scene view will show a new Scene. This is an untitled and unsaved scene. The scene will be empty except for default objects; A main camera and light. #### Saving Scenes[​](#saving-scenes "Direct link to Saving Scenes") To save your scene, go to File>Save Scene from the top menu. Your scene will be saved as an Asset in your Assets folder and appear in the project window. #### Open A Scene[​](#open-a-scene "Direct link to Open A Scene") To open a scene, double click the scene asset in the project window. --- ### SceneSaveSettings #### Overview[​](#overview "Direct link to Overview") Scene save setting lets you upload your scene to Sine Space. Scene save setting lets you upload your scene to Sine Space. Once you have saved remember to remove Main camera from the scene as the region will be using 3rd person camera, which you do not need to add. Not removing main camera will cause region to be stuck at one view. ##### Add Landing Zone[​](#add-landing-zone "Direct link to Add Landing Zone") You need to define where users arrive when they log in to your region; and what direction they are facing. To do this, once your scene is set up, from the top menu in Unity select Game Object / Create Other / Landmark This will place a new landmark item in your scene. In the Inspector window, set the type to Landing Zone and tick Spawn Point. The in scene object is a yellow edged transparent plane which you can position anywhere in your scene. The yellow arrow points in the direction your visitors will face when they arrive. Be careful to position the landing zone slightly above the terrain; if a tall avatar's feet arrive below the terrain they may fall through. ![Landmark.jpg](/assets/images/landmark-176333f3b045da840625d344095bf643.jpg) ##### Add scene settings component[​](#add-scene-settings-component "Direct link to Add scene settings component") In the top menu in Unity go to Space / Scene Settings. This will add a Virtual Goods component to your scene. You will see a set of fields in the Inspector. You can return to this component any time via Space / Scene Settings. ![Scene settings.jpg](/assets/images/scene-settings-ffb81843fcf07b8ab61fd095aeb0e3eb.jpg) In the Inspector set the Content Type to Region. ![Type region.jpg](/assets/images/type-region-1c8e4fd17fad6107d0d93ca2f17c7a98.jpg) ##### Primary descrition[​](#primary-descrition "Direct link to Primary descrition") Add the name, description and brand identity of your region as you want it to appear in the explore and discovery panels of the Space platform. ![Primary description.jpg](/assets/images/primary-description-8775a7d5fa5da08ef0e1dd620a561ff0.jpg) ![512px-Region loading.jpg](/assets/images/512px-region-loading-1e019ac92158def8d7aca402f71af5d1.jpg) ##### Localisation[​](#localisation "Direct link to Localisation") You can add slots for as many different languages as you want to. ![Localisation settings.JPG](/assets/images/localisation-settings-c8ddb5ca8b63df722193411e6c644873.jpg) ##### Images And Icons[​](#images-and-icons "Direct link to Images And Icons") If you are uploading items that will be sold as virtual goods to other Space users, add the store icons and imagery here and set the prices for Gold and Silver credits. ![For sale.jpg](/assets/images/for-sale-164a75a59ef40b10a29564e27393cf9b.jpg) If you are uploading a region or item that is not for sale, tick the not for sale box. You do not need to add any images or icons if the item is not for sale. ![Not for sale.jpg](/assets/images/not-for-sale-33d25ca8de5c21b52a3753b5b3d66625.jpg) ##### Dual Currencies[​](#dual-currencies "Direct link to Dual Currencies") If your region is going to be for sale, allowing other users to buy it as a template they can then customise as a private region for themselves, set it for sale and set your gold and silver prices. For more infomation on gold and silver currencies; [Currencies - Gold and Silver](/curator-dashboard/items/currencies.md) ##### Content Maturity[​](#content-maturity "Direct link to Content Maturity") Choose an appropriate content maturity level; ![Content maturity.jpg](/assets/images/content-maturity-54a21e876850ad33000c8204adf7f5f0.jpg) ##### Creator Information[​](#creator-information "Direct link to Creator Information") The creator information should show the details of the legal entity holding the account; whether that is an individual or a company. ![Creator information.JPG](/assets/images/creator-information-9cfdcfb86b43b7db54afc22f4cb653eb.jpg) ##### Export Mode[​](#export-mode "Direct link to Export Mode") The Export Mode defines how your region content is received by your visitors; all at once before they log in, or progressively after they arrive. ![Export mode.jpg](/assets/images/export-mode-1c278cb6a79e433e7d971aaa60087563.jpg) * Single scene Single scene delivers the entire region to the user as a single file which downloads before their avatar spawns. For regions with download sizes up to 100 mb, Single scene is likely to be an acceptable download time for your visitors. * Multi bundle Multi bundle is a form of dynamic loading control. It splits your scene into smaller components that are streamed to the visitor progressively. The multi bundle algorithm examine every root object in your scene and compares each with every other root object. It then bundles objects where there is more than 40 kbytes of overlap in shared data between them. You group into root objects has a big factor on how we create bundles; for instance grouping all vegetation or grouping one particular building where users will arrive. Too many bundles will cause stuttering for the user while they are progressively loading. A reasonable target is 20 – 30 bundles. * Additive scenes Additive scenes is a Unity utility that allows you to organise a single region into multiple scenes. You can manually split content, creating a root scene containing occlusion, lightmap and navigation data, with additional scenes loading mesh and other content progressively. You will need Unity 5 multi scene tools to manually set this up. For more information, see; * Required download When you are using Multi bundle mode you need to select one item in your scene, usually the terrain, and add a component to it called Manual Loading Control or Dynamic Loading Control. Then tick Required Download. This will ensure that the item is sent to the user before their avatar spawns. Without this there is a risk users will arrive and drop through space before your scene loads above their heads. ![Loading control.jpg](/assets/images/loading-control-e7c3b5cbb5896ee7c414780d90e1a390.jpg) * Suggested memory If your guest's device has less memory than this, they will be given a performance warning when entering the region. ##### World Map[​](#world-map "Direct link to World Map") The world map allows users to search and browse regions. The Preview Image you supply will be used as a background to preview your region in the World Map. It will also be used as the background while the region itself is loading. * Preview image The image you provide should be a .jpeg file. A 2:1 aspect ratio is recommended. Because the image is stretched to fit different screens it will distort slightly for some users. ![World map.jpg](/assets/images/world-map-dc60ce8f66dd9e0ae29da55ad4132bdf.jpg) * Loading logo The Loading Logo Image appears on top of the Preview Image and is not stretched, allowing you to present your brand logo or a region specific title without distortion. The image you supply should be a .png file with 512x256 dimensions. When you import the .png file, ensure the Alpha is Transparency box is ticked; ![Alpha is transparency.jpg](/assets/images/alpha-is-transparency-e871e8cb855ad08879ee76a9efb5c8f8.jpg) ##### Region URL[​](#region-url "Direct link to Region URL") You can assign a unique sub domain for each of your regions, which you can share with guests who can walk directly into your space from their browser. In the editor you can reserve your region name. Once the region is published you can then teleport directly to the staging server version (Creator) or the live public server version (Live). ![Url.jpg](/assets/images/url-f7f25fbb46af6462395d233777713aaf.jpg) ##### Supported platforms[​](#supported-platforms "Direct link to Supported platforms") The platform settings allow you to fine tune your region for each platform you want to publish to. Space currently supports; * Standalone - Desktop application, PC or Mac * Mobile / tablet - Android or iOS * WebGL - Chrome, Explorer, Firefox and Edge * Console - Sine Wave Entertainment is an accredited developer for Xbox and Playstation. The company is planning to release on these platforms later in 2016 after building a user interface for game controllers. ![Platform settings.jpg](/assets/images/platform-settings-80240dfebd684f8bf78ef7e8a755e517.jpg) ##### Settings[​](#settings "Direct link to Settings") The default settings are designed to work for most regions. Scene adjustment * Remove lightmaps / light probes / reflection probes Removing lightmaps and probes can significantly reduce download speed but will also impact on the runtime performance. More information; Lightmaps Light probes Reflection probes * Static bake meshes / colliders Ticking these boxes will prebake data before export. This improves loading performance but the region download will be bigger. More information; Static bake meshes Static bake colliders * Strip occlusion / navigation data Occlusion data holds information about what areas are visible from other areas; it allows the viewer to make intelligent decisions about optimising a scene, however it can add several mb of size to both runtime memory use; and download size. Keeping it improves performance but can result in higher memory use in big scenes. Navigation data is used for showing waypoints, and moving NPCs around in a scene; it uses a little bit of extra memory, and can be stripped out if you are under severe memory pressure. Texture size reduction * Max texture resolution All textures will be reduced to a maximum of the defined size for each build. * Texture reduction levels Reduces textures all by a multiple of the original, in line with Max texture reduction above. So; if your scene contains large textures at 1024x1024 and you set the max texture reduction to 512 those large textures will be reduced by a factor of 4. If you then set Texture reduction levels to 1, smaller textures in your scene will also be reduced by a factor of 4; so a 512x512 texture, which otherwise would have been unchanged by the Max texture reduction, would also be reduced by 4, to 256x256. If you set the Texture reduction level to 2 it will multiply the Max texture reduction scale by 2; so in the case above reducing the smaller 512x512 texture by a factor of 8, to 64x64. * Normal reduction levels This will apply a further multiplicative reduction on normal maps on top of the reduction already applied by the Texture reduction level above. Texture compression * Allow crunch / Crunch level Allows JPEG compression to be added to all textures in addition to DXT compression. This will degrade the quality of your images as the compression is lossy; but significantly reduces download filesize. It does not improve runtime memory size except during loading. Crunch level runs from 0 (very lossy) to 100 (lossless). * Compress textures This applies a further quality reduction, comparable to the quality slider in Photoshop when saving a jpeg file. * True color As 16 Interprets images stored as 'True Color' to 16-bit colors. This applies compression to the colors, without introducing the blurriness / artefacts that DXT compression can introduce; at the expense of being slightly larger. With this ticked, any image with 'True Color' compression, will be packed at 16 instead of 32-bit on this platform. Audio settings * Force audio to mono Converts stereo files to mono for that platform. * Audio bitrate This is a percentage field. So whatever the bitrate of your original files, you can reduce by X% for each of the different platforms you publish to. For instance a set of 128 bitrate original files, left at 100% in the Standalone build can be reduced to 64 in Mobile and WebGL builds by setting this field to 50. ##### Report[​](#report "Direct link to Report") A summary of the objects and scripts in your scene which will notify you of potential issues. * Info This shows how many objects, root objects and colliders your scene has. It will flag potential performance issues. ![Report.jpg](/assets/images/report-a2803291fb7e0812b04639d31fc8e55f.jpg) * Script List Space currently has a white list of approximately 120 scripts you can deploy in your regions. The script list shows all the scripts in your project, flagging the ones not currently white listed, which will be stripped out when submitted. You can submit scripts to your account manager for inclusion in the white list. When the platform's SDK is released (scheduled for September 2016) the white list will be maintained in parallel. ![Script list.jpg](/assets/images/script-list-6edda199452dbb3fac4abedc430dca9d.jpg) ##### Apply compression settings[​](#apply-compression-settings "Direct link to Apply compression settings") Click this button to apply the [Region - Platform Settings](/sinespace-sdk/regions/platform-settings.md) to the assets in your scene. Once the automated compression has run you can manually adjust individual files before publishing. You might, for instance, apply 512 as a maximum image size for the WebGL version of your region but then revert one or more specific important textures back to a higher resolution. ![Change texture resolution manually.jpg](/assets/images/change-texture-resolution-manually-c5f84b7fe0ddae907a766d94688e2149.jpg) ##### Sort into layers[​](#sort-into-layers "Direct link to Sort into layers") Click this button to automatically assign every asset in the scene to one of four draw distance layers, according to their size; larger objects are set to be visible at greater distances. The draw distance for each user is determined by the quality settings they select inworld; ![SettingsInGame.jpeg](/assets/images/settingsingame-f53fb306d149c079616f3fcb33f4c2ad.jpeg) Default = 20 to 75m Important = 80 to 320m VImportant = 240m to 900m NotImport = Max 30m (60m in Beautiful/Ultra) NotImportLandmark = Max 60m (120m in Beautiful/Ultra) If you do not apply Sort into layers button everything will be left in default layer. After applying you can manually review and modify; ![Manual change draw distance layers.jpg](/assets/images/manual-change-draw-distance-layers-56b362f19b5e464998ad1b2fb2bf7e98.jpg) ##### Automatic submission[​](#automatic-submission "Direct link to Automatic submission") Once your scene is ready to submit, click Automatic submission. This will create a zip file containing the region and will send it to the Space servers. Here the assets will be unpacked and compiled for each of the different platforms you have specified. You will receive three automated emails; confirming the content has been received, has started processing and has been released for you to log in and review. --- ### Submission #### Overview[​](#overview "Direct link to Overview") Submitting your region uploads it to - a preview server where content can be reviewed online before going to the live servers. Submitting your region uploads it to - a preview server where content can be reviewed online before going to the live servers. ##### Report[​](#report "Direct link to Report") A summary of the objects and scripts in your scene which will notify you of potential issues. * Info This shows how many objects, root objects and colliders your scene has. It will flag potential performance issues. ![Report.jpg](/assets/images/report-a2803291fb7e0812b04639d31fc8e55f.jpg) * Script List Space currently has a white list of approximately 120 scripts you can deploy in your regions. The script list shows all the scripts in your project, flagging the ones not currently white listed, which will be stripped out when submitted. You can submit scripts to your account manager for inclusion in the white list. When the platform's SDK is released (scheduled for September 2016) the white list will be maintained in parallel. ![Script list.jpg](/assets/images/script-list-6edda199452dbb3fac4abedc430dca9d.jpg) ##### Apply compression settings[​](#apply-compression-settings "Direct link to Apply compression settings") Click this button to apply the [Region - Platform Settings](/sinespace-sdk/regions/platform-settings.md) to the assets in your scene. Once the automated compression has run you can manually adjust individual files before publishing. You might, for instance, apply 512 as a maximum image size for the WebGL version of your region but then revert one or more specific important textures back to a higher resolution. ![Change texture resolution manually.jpg](/assets/images/change-texture-resolution-manually-c5f84b7fe0ddae907a766d94688e2149.jpg) ##### Sort into layers[​](#sort-into-layers "Direct link to Sort into layers") Click this button to automatically assign every asset in the scene to one of four draw distance layers, according to their size; larger objects are set to be visible at greater distances. The draw distance for each user is determined by the quality settings they select inworld; ![SettingsInGame.png](/assets/images/settingsingame-afff790b767244ffd087c540a4eb2ead.png) (Performance setting range: Fastest < Fast < Simple < Good < Beautiful < Fantastic < Ultra) Default = 20 to 75m Important = 80 to 320m VImportant = 240m to 900m NotImport = Max 30m (60m in Beautiful~Ultra) NotImportLandmark = Max 60m (120m in Beautiful~Ultra) If you do not apply Sort into layers button everything will be left in default layer. After applying you can manually review and modify; ![Manual change draw distance layers.jpg](/assets/images/manual-change-draw-distance-layers-56b362f19b5e464998ad1b2fb2bf7e98.jpg) ##### Automatic submission[​](#automatic-submission "Direct link to Automatic submission") Once your scene is ready to submit, click Automatic submission. This will create a zip file containing the region and will send it to the Space servers. Here the assets will be unpacked and compiled for each of the different platforms you have specified. You will receive three automated emails; confirming the content has been received, has started processing and has been released for you to log in and review. --- ### Upload Settings #### Overview[​](#overview "Direct link to Overview") Add scene settings component In the top menu in Unity go to Space / Scene Settings. ##### Add scene settings component[​](#add-scene-settings-component "Direct link to Add scene settings component") In the top menu in Unity go to Space / Scene Settings. This will add a Virtual Goods component to your scene. You will see a set of fields in the Inspector. You can return to this component any time via Sinespace / Scene Settings. ![SceneSettingsMenu.png](/assets/images/scenesettingsmenu-1c6da190eb7affb52aeac62079ab45f5.png) In the Inspector set the Content Type to Region. ![SceneUploadType.png](/assets/images/sceneuploadtype-1310580e1e140890d4fcc1d37916df9a.png) ##### Primary description[​](#primary-description "Direct link to Primary description") Add the name, description and brand identity of your region as you want it to appear in the explore and discovery panels of the Space platform. ![Primary description.jpg](/assets/images/primary-description-8775a7d5fa5da08ef0e1dd620a561ff0.jpg) ![512px-Region loading.jpg](/assets/images/512px-region-loading-1e019ac92158def8d7aca402f71af5d1.jpg)![512px-Explore regions.jpg](/assets/images/512px-explore-regions-c806b3362e4a5a2c17a144b6bc5cd4b4.jpg) ##### Localisation[​](#localisation "Direct link to Localisation") You can add slots for as many different languages as you want to. ![Localisation settings.JPG](/assets/images/localisation-settings-c8ddb5ca8b63df722193411e6c644873.jpg) ##### Images And Icons[​](#images-and-icons "Direct link to Images And Icons") If you are uploading items that will be sold as virtual goods to other Space users, add the store icons and imagery here. It is not necessary if you make the region not for sale. ![RegionSplashImage.jpeg](/assets/images/regionsplashimage-51d0e5cc17eafe9fee2a509966d81758.jpeg) Tick the "Not for sale" checkbox will not put the region in the shop and you can set an amount of the maximum one player could own. 0 by default sets the amount unlimited. ![CheckNotForSale.png](/assets/images/checknotforsale-d7b739b829fa7d5ee28b369166d68143.png) Otherwise, leave it unchecked and you can set the price of the region. You can also make it enalbe for promotion, so you can offer a discount easily instead of modify the price then reupload. ![Sceneupload04.png](/assets/images/sceneupload04-daea40e7ca4179a799e443c5108e842f.png) ##### Dual Currencies[​](#dual-currencies "Direct link to Dual Currencies") If your region is going to be for sale, allowing other users to buy it as a template they can then customise as a private region for themselves, set it for sale and set your gold and silver prices. For more infomation on gold and silver currencies; ##### Content Maturity[​](#content-maturity "Direct link to Content Maturity") Choose an appropriate content maturity level; ![Content maturity.jpg](/assets/images/content-maturity-54a21e876850ad33000c8204adf7f5f0.jpg) ##### Creator Information[​](#creator-information "Direct link to Creator Information") The creator information should show the details of the legal entity holding the account; whether that is an individual or a company. ![Creator information.JPG](/assets/images/creator-information-9cfdcfb86b43b7db54afc22f4cb653eb.jpg) --- ### Scene & Assets #### [πŸ“„οΈVolumetric Lighting](/sinespace-sdk/scene-authoring/volumetric-lighting.md) [Volumetric Lighting documentation for Sinespace.](/sinespace-sdk/scene-authoring/volumetric-lighting.md) --- ### Animating textures, for users of that other platform #### Overview[​](#overview "Direct link to Overview") 1. Level: - Beginner Unity/Space, experienced with texture animation in Second Life (tm) 1. 1. Level: * Beginner Unity/Space, experienced with texture animation in Second Life (tm) 1. Goals: * Discover the difference between animating textures in SL and materials in Unity * Learn about the animation system * Produce your own animated materials ##### A brief examination of the two systems[​](#a-brief-examination-of-the-two-systems "Direct link to A brief examination of the two systems") * **Core construction elements** Second Life is a fairly old platform, and as such it faced many challenges with respect to embracing a variety of hardware, most of it less than capable when it comes to graphics performance. Consequently, many choices were made that optimized for both low performance requirements (relatively speaking), and simplicity in the toolset, which was entirely self-containted in it's original form. Unity, in contrast, exposes the full spectrum of hardware capabilites to the creator in the editor interface. Additionally, every opportunity has been made to keep Unity highly performant at the 'point of sale'. There are consequences in each of these platform design choices. Like the differences in platforms, the differences in consequences are significant. For Second Life, keeping things very simple and spreading the resources around the application was paramount. The success of this model is obvious; it's a horse many of us get on and ride with satisfaction and utility to this day. Unity, however, is a stealth jet. Piloting skills are required. So what does all this have to do with texture animation? Well, only a lot. The objects produced by and for Second Life users are made up in-situ, out of object components that are mathmatical abstractions of models. As such, they have some fairly unique properties. As with anything unique, it sets all else apart. Unity, however, directly employs modelled assets freely available to the video gaming marketplace; or that are produced using the same industry standard tools as these models. It is a gaming engine, not a modelling/animation suite. 3DSMax, Maya, Cheetah3D, Blender, the list goes on; all of these, with notable exceptions, focus on being modelling or animation tools. Chances are, if it can export an FBX or OBJ filetype, it can be used to produce models for Unity. This leaves Unity with substantially more resources to bring to bear upon delivering a strong game engine. Let's cut to the chase: can we animate the faces of objects with textures in Unity, as we do in Second Life? The short answer is no. Not even a little. That doesn't mean the same effect can't be achieved; it simply means that the method by which it is acheived may seem quite foreign when first encountered. Just remember, when in Rome, do stuff like the Romans do. *One quick note:* It has become possible in the past few years to upload fully modelled mesh content to Second Life. We're not going to worry about that too much, except to say that making content for Unity is lagely identical to making mesh content for SL, so if you know anything about that, you have an idea of the nature and scope of the task. * **Materials vs. Textures** It is perhaps useful to imagine that there is a *nature* about all this. *natural* in this context means that there are certain operations performed by modern graphics hardware; these operations being performed by special programs called 'shaders'. Without getting too over the top, shaders do some very specific things in some highly optimized ways. This nature is exposed directly in the Unity editor interface. In this way of thinking, SL is a bit *unnatural*. It provides some very limited functionality using shaders that it keeps quietly hidden away. This is because shaders are made to work on models, and Second Life content is not modelled as such; it's built up of a variation, an arithmetic shortcut called 'primitives'. Beyond that I wont waste time on a discussion of that technology; we're acutely aware of how that all works. In SL there is (potentially) a texture per face. In Unity, there are objects, and they are skinned with materials. Pay close attention: the material is applied *per object*, not per face. If you wish to have an object that has different textures exposed on a per-face basis, then it needs to be a complex object, with child objects that provide the illusion of distinct faces. This does not mean a simple object cant have multiple faces; it does mean however, that all the faces in a simple atomic object will share the same material. * **Script API vs. Scene Graphs** In SL too the approach to animating the textures on the faces of *prims* is quite different. Via one or two functions, certain pre-supposed effects are exposed in their calling parameters for setting the scale, rotation, and position, and various 'effects' like loop, pingpong, direction, and speed. With Unity, as mentioned before, materials are used. A Unity material is one or more textures, used in various ways by a shader and some parameters based on the operation performed by the shader. The shader runs right on the graphics hardware, and does what shaders do (render a pixel). Like just about everything else in Unity, materials can be animated. Every property exposed in the inspector (and often some that arent thusly exposed) can be animated with the animator. The animator produces 'animation clips', which are collections of *scene graphs*. A *scene graph* is the set of all datapoints for a given parameter over the course of a period of time. If a lit pixel is moved across the screen horizontally, it's scene graph is the increasing value over time of it's 'X' screen coordinate. That value for 'X' can be plotted on a graph vs. elapsed time, hence the name *scene graph*. In Unity, a collection of such scene graphs is collected into a little proprietary bundle per-object called an *animation clip*. You can get into the animation editor for an object in at least two ways. One, select the object either in the scene or in the hierarchy, and press **CTRL 6**. The other is from the main menu, 'Window->Animator'. You should see something like this: * *Fig. 1: Ready to work on some water flowing over a stone* The first thing to do is create a new material. Select your assets folder in your Projects window/tab. Then from the main menu, 'Assets->Create->Material'. Give the new material a new name, like 'FlowingWater'. Next you're going to need a nice image of some water, evenly lit. Import that from the main menu, 'Assets->Import New Asset' and pick your file. For the purposes of this tutorial, I just snagged one off google images. Seamless is pretty important if you want it to look right ;) Make certain the new material is selected in your project window/tab, and scroll down to the material in the inspector. Note the dropdown picker for 'Shader'. Find the one that is called 'Standard (Specular setup)', and below that set Render Mode to 'Transparent'. Skipping down to 'Main Maps', Find the little sqaure with the little circle beside it labelled 'Albedo'. Click the little circle, and pick your recently imported water surface asset (2DTexture). Set it's tint to a pleasant shade of green, preferably one close to something presnt in your water image. Set a specular color too. Adjust the smoothness slider to get that ideal balance between shininess and transparency. If you have one, use a water normal map asset (2DTexture). It doesn't much matter whether it matches the water texture you're using, though it should be tileable. I used a normal map that I had laying around from another project. It will improve the appearance of my water, but it would work fine without it, and might not be at all appropriate if you *aren't* animating water. We wont be introducing a specular map in this little assembly. Scrolling down beyond Global Illumination, find 'Tiling' and 'Offset'. If these sound familiar to you, you are correct, and they do much what you would expect them to do. These are also what we'll be animating. It should be noted at this point that while it doesn't impact this workflow, there is no parameter exposed for doing rotation in this material. This is because this shader does not do rotation. There are shaders that do, and it is likely that when one such is used, it's rotation properties would be exposed in a similar material parameters inspector window. If you are playing along in the editor, you should have something more or less like this: * *Fig. 2: Stone shaped mesh object skinned with flowing water material (yet to be animated)* Now it's time for the animation. Click the 'Create' button in the center of the animator window and create a new animation file. Give the animation a good name like 'FlowingWater' or something ;) Now it's time to get our properties on the graph. In the inspector, change the value of 'Tiling', both X and Y. Note that there are now new properties in the animation window. Opening their dropdowns, you'll see each of x,y,z,and w. The numbers associated with these can be clicked on and edited just like any other constant supplied to a Unity interface. Repeat the process for Offset. It doesn't much matter what values you change them to; rather, it's important to trigger the insertion of the properties in the animator's interface. These are not displayed directly in 'Add Property' picker in the animator interface as their specific name may vary from one shader to the next. Once you have the two sets of properties showing up in your animator window, set the values back to their defaults of 1,1 0,0 for each of Tiling X,Y and Offset X,Y. Next right-click on the dark grey rectangle to the left of the upper scrolling arrow where it intersects the red line. Click the 'Add Key' Selection in the popup. Next, click right on the timeline at 1:00. This should move your scene graph cursor (the red line). Repeat the addition of the keys at the end of the clip: * *Fig. 3: Setting up the material animation* Now click the diamond at the topmost of the column on the right, under the scene graph cursor. Drag it to the right, expanding the animation timeframe; take it out to 5:00. Now we are ready to set the ending keyframe. In my piece, I set the Tiling to 3 in both directions, and Offset I started at 0 and then set to 10 at the end. You can preview the animation by clicking the 'Play' button on the animator controls. Here's mine running in scene preview: * [Animated water over stone](https://youtu.be/FeXxEgT70r0) * *Fig. 3: The completed animated material* A huge thanks and a shout out to Adam Frisby for detailing this functionality sufficiently well that I could get it done and make a wiki entry about it ;) --- ### Custom skybox shader #### Overview[​](#overview "Direct link to Overview") The Custom Skybox shader introduced in Space Editor Pack 08 produces a realistic night sky and procedural two dimensional clouds. The Custom Skybox shader introduced in Space Editor Pack 08 produces a realistic night sky and procedural two dimensional clouds. It is very effective, and very easily employed, thanks to the provided example procedural skybox. Simply slot the skybox (found in Assets/Sample Art/Adam-CloudSkybox) titled 'Sample Cloud Skybox' in the 'SkyBox' slot of your 'Lighting' window. It should be pretty much good to go, though there are settings that one might wish to explore. Additionally, the shader code for the shader used in this skybox is available in the assets for the sake of review or modification. --- ### Embedded Video #### Overview[​](#overview "Direct link to Overview") Creating a video player Sinespace allows for creators to embed Youtube videos onto objects they create in Unity with The Editor Pack. #### Creating a video player[​](#creating-a-video-player "Direct link to Creating a video player") Sinespace allows for creators to embed Youtube videos onto objects they create in Unity with The Editor Pack. The Embedded Video (Script) component allows for the creator to embed Youtube and other video content into Unity Materials. To successfully work with the Embedded Video (Script) component in sinespace you will need to have the following components added to your object For this walk through, I am using a standard cube prefab. #### Adding required components[​](#adding-required-components "Direct link to Adding required components") ##### Unity & video components[​](#unity--video-components "Direct link to Unity & video components") β€’ Video Player β€’ Audio Source β€’ Embedded Video (Script) β€’ A New Material ##### The required sinespace components[​](#the-required-sinespace-components "Direct link to The required sinespace components") β€’ Virtual Good β€’ Room Furniture * Note:\*\*These are not necessary if you are adding the video player to an existing region #### Tutorial: Building a simple video player[​](#tutorial-building-a-simple-video-player "Direct link to Tutorial: Building a simple video player") ##### Video Player[​](#video-player "Direct link to Video Player") Select the preferences you desire * Render mode:\*\* Material Override * Material Property:\*\* \_MainTex ##### Audio Source[​](#audio-source "Direct link to Audio Source") Basically, leave as is or configure to your own preferences ##### Embedded Video[​](#embedded-video "Direct link to Embedded Video") * Auto Play:\*\* Select if you desire, otherwise it will play on click, but be sure to make the **Box Collider** a trigger * URL:\*\* Enter the URL of the video you wish to play ##### New Material[​](#new-material "Direct link to New Material") Create a new blank Material and add it to the object Attach the Material to the Mesh Renderer component Attach the Material to the Embedded Material component under **Target Material** ##### Virtual Good[​](#virtual-good "Direct link to Virtual Good") Select the preferences you desire here For this example, we’re using the Furniture/TV category Complete the rest of the Virtual Good component in preparation for upload ##### Furniture[​](#furniture "Direct link to Furniture") Select the furniture preferences you desire * Please note: \*\*You can theoretically attach video playback to any object type you wish ##### Finalisation[​](#finalisation "Direct link to Finalisation") Convert your object to a Prefab and prepare it for uploaded into sinespace You can now upload your Embedded Video object, be sure to test it in the preview environment --- ### GameObjects #### Overview[​](#overview "Direct link to Overview") Category:Tutorials GameObjects are essentially every different item you put into your scene. GameObjects are essentially every different item you put into your scene. If you have placed a teddy bear in your scene, this is a GameObject, or if you have a car, this is a GameObject too. These GameObjects are like having an empty mug, but it only becomes useful when it has something to drink in it. GameObjects need **Components** to change them from a plain teddy bear, into a dancing, smiling teddy bear, or changing a shell of a car into a car you can actually drive with physics. Lights in your scene work the same too; They are just a GameObject, which needs a component to make it a light. So, anything you can dream up and create or add to your scene, is a GameObject. This Cube in scene is a GameObject as well. --- ### Gimp (8-bit) #### Overview[​](#overview "Direct link to Overview") Without additional plugins, Gimp is limited to 8-bit accuracy. Without additional plugins, Gimp is limited to 8-bit accuracy. Depending on the desired altitude differences you may need to smooth the surface in Unity after import. First, the dimension of the heightmap must be decided: the more detailed the more memory and processing power used. A reasonable choice could be roughly 1 point per 2 meters. The terrain size can be chosen freely, but the heightmap size must be one of the following: 33x33, 65x65, 129x129, 257x257, 513x513 1025x1025, 2049x2049 or 4097x4097. 1. In Gimp you create a new image with the chosen heightmap size, for example 513x513. In the extended adjustments choose gray scale instead of RGB colours. 2. Now, paint some structure and smooth it, or alternative you can import images from elsewhere. OpenSim for example can export terrain to .png graphics, which are understood by Gimp. 3. If a terrain heightmap is designed, you can export the result do the .data format. Gimp will show a dialog, in which you must switch from Standard (R,G,B) to Planar (RRR,GGG,BBB). The second selection remains on R,G,B (normal). 4. Unity understands only .raw images, so you must rename the .data output file into .raw file ending. 5. Now the import to unity follows. To reach the import dialog, enlarge the terrain section. In the right of the symbol bar a gear-wheel is shown. After selecting this, in the bottom of the shown details you find the button "Import Raw". That's near the place, where you surely already have chosen other region details like Terrain With, Length, Height, Detail resolution and so on. You select the file created by gimp, and after that a dialog box is shown. Here you can check if Unity has recognized the 8-bit data format and the dimensions of the heightmap. If not, here is the option to adjust it manually. Now, a checkmark must be set at "Flip vertically"! This is necessary, because the Y axis of Gimp points from up to down (into south direction), but in Unity the corresponding Z axis points into north direction. That's it, after pressing the "Import" button the terrain should appear in the new structure. --- ### Gizmos #### Overview[​](#overview "Direct link to Overview") Gizmos are a tool used in Unity which accompany each component as a visual aid. Gizmos are a tool used in Unity which accompany each component as a visual aid. For building in a scene, you will be using these tools: * Pan * Move * Rotate * Scale * Rect Tool Apart from Pan, all of these tools use gizmos to make it easier for you to transform your objects. #### Move Gizmo[​](#move-gizmo "Direct link to Move Gizmo") You can freely move your object around with the square inside the gizmo by grabbing it, or you can constrict the movement to up, down, left or right by using the arrows attached to the gizmo. #### Rotate Gizmo[​](#rotate-gizmo "Direct link to Rotate Gizmo") Using the green rotate line will rotate the object either clockwise or anti-clockwise on a 180 degree angle. If you use the red rotate line, this will tip the object upwards or downwards. If you use the blue rotate line, this will rotate the object on a 90 degree angle. #### Scale Gizmo[​](#scale-gizmo "Direct link to Scale Gizmo") You can use the white square on the scale gizmo to scale the object across all three axis simultaneously. You can use the green square to scale the object on the Y axis, use the blue square to scale the object on the Z axis and use the red square to scale on the X axis. #### Rect Tool Gizmo[​](#rect-tool-gizmo "Direct link to Rect Tool Gizmo") The Rect Tool can be used to move, resize and rotate objects. You can move an object by clicking inside the rectangle and drag it anywhere. You can resize it by clicking on the edges or corners and dragging. An object can be rotated by hovering the cursor slightly away from the corners until the mouse cursor looks like a rotation symbol. You can then click and drag in either direction to rotate. #### Gizmo Settings[​](#gizmo-settings "Direct link to Gizmo Settings") There is a gizmo dropdown menu on the top of the scene and game windows. When this menu is opened, it will show options to Show Grid and change the size of the gizmo/3D icon, and also show a list of the components in Unity with a check box next to them. If you uncheck the boxes, this will disable the gizmo for the chosen component. For example, if you want to turn off the gizmo for lights in the scene, uncheck the Light from the components list. This will hide the icon for Light. --- ### Importing 3D Models #### Overview[​](#overview "Direct link to Overview") You can import 3D models you have made or downloaded from 3D model sites into Unity. You can import 3D models you have made or downloaded from 3D model sites into Unity. The recommended formats are FBX or OBJ; if you are importing skinning (weighting) information, we recommend using .FBX, however .Blend and .DAE will import skinning data as well. The simplest and easiest way to import your 3D file is to simply drag and drop the file into your unity project assets directory. The directory will be where you saved the project after creating one initially during the installation of the Editor Pack. When you open Unity, the file will be in your Assets folder. You can create a new folder for the item by right clicking in the Assets folder, and choosing **Create>Folder**. You can then follow the guides and tutorials on the wiki to build regions or upload your clothing items to space. --- ### Importing Assets from the Asset Store #### Overview[​](#overview "Direct link to Overview") To import assets from the asset store, first go to the Asset Store either directly from within Unity program, or from the website Asset Store You can find the Asset Store within Un To import assets from the asset store, first go to the Asset Store either directly from within Unity program, or from the website [Asset Store](https://www.assetstore.unity3d.com/en/) You can find the Asset Store within Unity here: You can search for an item using the search bar or by using the categories on the right hand side of the Asset Store page to find an item. If you are using the Asset Store website, the item you have chosen will have a **Open in Unity** button next to its' image. Click on the button, and the browser you are using will ask for permission to launch Unity. Accept this and Unity will open. Your chosen item will now appear in the Asset Store within Unity, and the button next to the item will now say **Download**. If you are using the Asset Store from within Unity, the item will already say **Download**. Click on **Download**. Read and accept the Terms and Conditions. This will start the download of your item. Once the download has finished, an Import Unity Package window will pop up. Make sure all of the items are selected for the import, other wise your item might not work correctly. Click on the **Import** button. This will import the item to its' own folder inside of your project. --- ### Morph Shapes #### Overview[​](#overview "Direct link to Overview") MORPH SHAPES TUTORIAL Prequisites You are expected to have installed Unity and a valid Editor Pack installed correctly ( called SDK on Unity's Asset Store). ###### MORPH SHAPES TUTORIAL[​](#morph-shapes-tutorial "Direct link to MORPH SHAPES TUTORIAL") #### Prequisites[​](#prequisites "Direct link to Prequisites") You are expected to have installed Unity and a valid Editor Pack installed correctly ( called SDK on Unity's Asset Store). #### Creating the Morph Shape[​](#creating-the-morph-shape "Direct link to Creating the Morph Shape") You will be using our avatar model in your 3D modelling tool of choice. You will find it included in our Editor Pack. Here we use Blender which is free to use. This is the default start scene in Blender. Delete cube, lights and cameras - we don't need those. Go to File and Import, then pick FBX. Here is the import window. You should see this. Click off and on the model and click the Collections icon here: Now delete the existing Morph Keys. We now add two morph keys - clicking the plus sign. The first will be our 'Basis' and the second our new morph. While on that new morph, double click to rename Now ensure the value is set to 1. Now switch to Sculpting mode. After my changes here is our face morph. That's it for the Blender part. Now we export to FBX. #### Export FBX From Blender[​](#export-fbx-from-blender "Direct link to Export FBX From Blender") Go to File then Export then FBX. Make sure your export settings are the same as this. Do ensure !Expermintal! Apply Transform is checked and Bake Animation is unchecked. Then click Export. #### Import FBX into Unity[​](#import-fbx-into-unity "Direct link to Import FBX into Unity") Now we switch to Unity. Here we have an empty scene ready and a work folder created called "Morph Tutorial Folder". You of course, should use your own recognisable name. With this folder selected, right click in the empty right hand pane of your project and select Import Asset. Locate your folder where you exported the modified 2017 Male into. First go to Assets. Then go to your work folder and import the model. Here our model is now imported into the project. #### Checking Our Morph Has Imported[​](#checking-our-morph-has-imported "Direct link to Checking Our Morph Has Imported") Drag the model into the scene/hierarchy and expand the model to see its child objects. Check the mesh has a skinned renderer and that you can see your morph name. Dialling this to 100 will reveal your morph. Leave it set at 100. #### Creating the Vertex Displacement Map[​](#creating-the-vertex-displacement-map "Direct link to Creating the Vertex Displacement Map") Open the menu item: Sinespace->Tools->Custom Shapes->Create Body Morph Texture Now click into the Assets folder and then into your work folder. You will now see the Create Morph Map dialog box. Drag the mesh (from the project) into the top slot. Put a checkmark into Preview and Overwrite Silently then click Bake Map. Type the name of your morph into the "Original Blendshape" field. Uncheck Incorporate Normal. Set preview options. In your project search box, type 2017 and drag the 2017 Male file into the Alternative Avatar slot. The reason we do not use the Base Avatar for preview is that this defaults to the Male version and cannot be used for a Female morph. Therefore it's better to get into the habit of locating the individual 2017 Male/Female avi's manually. ![Shot 24 - Alernative Avatar drag.jpg](/assets/images/shot-24-alernative-avatar-drag-ae1d12aea1fb564ea686a5d4c8d81f3b.jpg) Click on your work folder in the project and then click Bake Map. A preview of your morph will show in the scene. Move the original out of the way to compare that they are the same. Now click on the new displacement map in your project work folder. Ensure sRGB is off, Read/Write is enabled, Generate Mipmaps off, Wrap Mode is Clamp, Filter Mode is Point. No compression. Then click Apply. You might see some very subtle pastel RGB shadings but Unity cannot show the preview properly for the morph map generated. Here's what it looks like in Krita. #### Creating The Virtual Good[​](#creating-the-virtual-good "Direct link to Creating The Virtual Good") Now we get to the final step - creating the virtual good. Right click an empty part of the hierarchy and create an empty game object. Rename your game object to something recognisable. Add a Clothing Item Settings component. Tick and expand Body Slider. Then drag the generated morph texture into the Vertex Displacement Map slot. Ensure the skeleton is set to Base Male. Add a virtual good component. Set the type to Clothing and the category to Clothes / Body / Morphs. After completing that, drag your item from the hierarchy to your project. Right clik it then select Upload to Sinespace. #### The Result[​](#the-result "Direct link to The Result") Here's the finished item in world, called "Morph Tutorial" and is available free in the shop. --- ### Post Processing #### Overview[​](#overview "Direct link to Overview") Post Processing allows different effects and lighting to be added to your scene or region. Post Processing allows different effects and lighting to be added to your scene or region. There are number of different settings, which we will explain here, and also show you how to create a Post Processing Profile in your scene in Unity, including how to enable real time editing of the settings. Space Post Processing profiles also adds volumetric lighting to these settings. When you have your scene open in Unity with your region layout, you can add a Post Processing Profile. This is the profile which includes all of the different effects and the effect settings. To add this profile, right click in your project window and go to Create>Space Post-Processing Profile. Click on the profile in the project window, and under the inspector window, you will see this: These are all the different effects included in the post processing profile. You can toggle the settings on and off by clicking on the small circle next to the effect name. For more information on what all of these effects are, you can go to the [Unity Post Processing Stack](https://docs.unity3d.com/Manual/PostProcessing-Stack.html) page and see each effect and their settings individually. #### Real time editing of post fx[​](#real-time-editing-of-post-fx "Direct link to Real time editing of post fx") To see real time edits of post fx settings in your region, first add a player character in to your scene. You can add a player character by typing in the project window search bar, and select the 'player character.' Once the player character is in your scene, you can move it around until it is in the right place for you. Make sure you have deleted the main camera from your scene as well, as you will use the player characters' camera for the real time edit preview, and not the main camera. Click on the drop-down arrow next to the player character in the Inspector window. Click on Main Camera in the list. Under the Inspector window, there will be a lot of different scripts, but scroll down on the Inspector window until you get to a script called Post Processing Behavior. Drag the Post Processing Profile you just made from your Project window into this script. Once this is done, click on 'Play' at the top of Unity. Once it has started to play the scene, drag the Post Processing Profile into the Post Processing Behavior script again. Switch to the Game window, then click on your Post Processing Profile. Here you can toggle the post fx on and off, and play around with the settings, and in the Game window, you will see the changes happening in your scene! #### Uploading a scene with post fx[​](#uploading-a-scene-with-post-fx "Direct link to Uploading a scene with post fx") To make sure that the post fx stay in your scene/region during upload, you need to add an empty game object into your scene. To add the empty game object, right click in the hierarchy and choose Create Empty. With the empty game object selected in the hierarchy, go to the Inspector window, and click on 'Add Component' and search for PostZone script. Drag the Post Processing Profile into the Post Profile box, as shown highlighted in the image above. Once this is done, you can upload the region as normal. --- ### Volumetric Lighting #### Overview[​](#overview "Direct link to Overview") Volumetric Lighting documentation for Sinespace. [YouTube video player](https://www.youtube.com/embed/52uMeVJ2ePo) --- ### Scripting #### [πŸ“„οΈScripting Data](/sinespace-sdk/scripting/scripting-data.md) [The Scripting Data components allow you to attach properties to an object without having the full Scripting Runtime.](/sinespace-sdk/scripting/scripting-data.md) --- ### Scripting Data #### Overview[​](#overview "Direct link to Overview") .png>) The Scripting Data components allow you to attach properties to an object without having the full Scripting Runtime. ![](data:image/png;base64,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JiZGp0REVHNERUVZc9ULxmSOjY21lq5BBwghB05sj+G07J8zAZSIiGqOm2++2ZqrXjAWc0QDJxER1WwYXxgJU00LnGwcREREIfHux7WmYOAkIiJygYGTiIgqHMY1xqsqYuAkIiJygYGTiIjIAR65dMJWtUREFLL8/PygW9UGKpqdN2+eNRe6vn37WnPOfvzxR2suMLaqJSIiigBmnEREFDI3GefWrVutOZF3331Xp7/5zW90Cn369LHmQnfq1ClrzlmrVq2sucDYAQIREUWcm8BpZ4ptI1E8W15YVEtERBQBDJxERBSyUEsrUURrL6atjPCzOf18LKolIqKQ5ebm6ihZiYmJ1prq4cKFC5Kdna3dCtoHMGEdJxERhaWwsFA7e0cMqS7Di125ckUDJIKm93CZDJxEREQusHEQERGRSwycRERELjBwEhERucDASURE5AIDJxERkQsMnERERC4wcBIREbnAwElEROQCAycREZELDJxEREQuMHASERG5wMBJRETkAgMnERGRC1EJCQlz4uPjpbi42FrlXvPmzWXs2LHSv39/GTVqlPTr10+ysrLk3Llz1hY1ywsvvCBDhw6V7777zlpT1i9+8Qs5fPiwDsljh8/6+xwREd04GJszIhlnt27dpGPHjrJ792554403ZP78+dK9e3frXXLStm1bmT59urRq1cpaQ0REVUFExuP81a9+Ja1bt5b33ntPzpw5Y629rl69enLvvfdKhw4ddPnQoUPyxRdf6OCngCwLkGn17t1bxzv77LPPJCkpSW6//XaN8GvXrpV9+/bpdmb7vXv3asDOyMiQ5cuXy/nz53V9KMez7x8Dlw4bNky6du2q+8LPtGbNmpIM2t/nzXt2L774ojV3HbbDeTdo0EA/u3379pL19u2ffPJJPQe4ePGifP3115qpgtN5+PveAv1cRETkX8TG40xMTNTppUuXdOoNQQwZ6OrVq/VC3qNHD13nDYHwo48+kri4OHn44Yc1mCxevFiX77nnHmur67755hv59NNPpVmzZqX2F+zx9uzZI0uXLi2z/xEjRmix88qVK2XBggXSpk0beeCBB6x3r3P6vD3oYd4paBrvv/++XL58We6//359RUdHW+9chwz+lVde0W1RJD5mzBjrneuC/d6C/bmIiMi3iDYOunLlijVXGrJCQKZ08OBBnTfr7NLS0uTs2bPWksiFCxdKlhs2bKhTu/T0dElOTtZ5ZLxGsMfD/k+fPq3z9v0jI4Nf/vKX8utf/1rnEbS8+fp8sJBxIoAhk0TGiOPZNWrUSMaNGyczZsyQqVOn6jrUR3vz9b2h3jqUn4uIiHyLSOA0mWbTpk116gsu5IGKhL3fD9RoKSoqSqcFBQU6tQvleIAiTkCmZ7LGl156Sdd5C6eIG5BxIptE8POu75wyZYpmzps2bZI333zTWussmO/Nzc9FRETOIhI4Dxw4oFNkNPXr15eEhAR59NFHdR2gjhGQ9XXq1EnnzbpwoGizZ8+eOm/fX7jH279/v04RtHCMJk2alGR8wcjOztZpy5YtdRoIWiAj8/SuazR1m8ePH5fGjRvrfDjC/bmIiChCgRN1ajt37tRAhcYsaCyEZQMNc3bt2qX1ePfdd5/OY124pk2bJsOHD9fiWjSaMcI93pdffikbN26UgQMHyh/+8ActLj127Jj1bmBfffWVZpIoDn3mmWestaV5Z4QItgieJrjB559/rut/97vfyV133WWtDV24PxcREUWoVW1FM61J/TW8ISIiirSItaolIiKqKapkxklERHQjMOMkIiJyiRknVUtOPVgREYXC/oQEMk4GTqqWcnNzJTY21rE3JiKiYBQVFUl+fn7Jo4HAwEnVFgInelli4CSiUCFwZmZmMnBSzWACJzq2JyIKBYZ9dAqcEWsc1KJFC3nsscfk2WeflVmzZunD/2Z0kupq9uzZ1pwzPG86c+bMkm4BwTyDSkREVVNEAicqTidPnqyjhaBP1bfeekvWrVsnnTt3traoudBIpVevXtYSERFVdVEJCQlzUKQVqDN1f8aPHy+bN2/WbvZQJoz0Fh2/m5FJAKN0TJo0SUaPHi3t2rXTrt5Mx+zIwpAKY4irAQMG6LmgD1oMoYXu4ZAqm7E2sS0afeCY2ObEiRMlfcMGOgb2O2HCBBk0aJB2iWf2if510f0cjod+XDHiCY4Jvj6H9eg0fejQofrCmJjesH7ZsmXa7d+2bdu0ONx72yeeeEKH+7rjjjv057CP+Rnsd+Lv/Gsq/B3i78Se7RMRuYFrNmKIvcoH1/2IZJwY0itQJ+ojR47Uzspff/11SU1N1WU7DIX1zjvvyKpVq3QMSQyLZZbvvvtua6trTp06JW+//bb2kWsfZzPQMVDvNW/ePB3D075P7AMd1b/66qs6ficCnZ3T59DdH4KZGWXEF4x6gnPq06ePtaY0ZOgvv/yyLFmypMyYo8F+J4HOn4iIIicigRMR2AxZ5Uvbtm1ly5YtGr2RnSIjtPvxxx8lLy9Pjh49qstbt27V5SNHjpQagxLBCkXCaCKMwImGTUawx8A4nfZxKlEXi4ztueee09FCMDC2na/PBQsZJrJG74YqGJ0EmSzqQTFGJgaetgv2Owl0/kREFDkRCZyox3MaKNofBEAn3q17/bX2RTEcioV9CfYYCPqvvfZaSfYY6bE3UWyNjPzOO++01lyDxlTInhcuXCh//etfQ/5Ogj1/IiIKX0QCJ4bRQtFhjx49tF4OdW7t27fXYb8MFFf2799f6tSpo9lXSkqK9Y57GO8T2dvgwYM1+zJCPQb2gaBWt25dzeQwHFkwUI9oz3j9+f7778sEThwP55iTk6PjhgbK2n0J9fyJiMi9iARO1CeuWLFCAyfGjsSYnGjwgqJNA2NLJiUlyVNPPSVt2rQJazzOiRMnytNPPy2JiYkatI1Qj4F6QQRjFJmiqBNZYDBwPLQm/v3vf2+t8Q2NiuxjbQLOb8qUKdpAKNgA7CTU8yciIveqXAcIeHZy7ty51hKRM3aAQEThKvcOEIiIiGoCdrlH1ZLJOFHv66vRFRGRL2hzgqcYnDJOBk6qlhA48QdORBQOxEYGTiIiohCxjpOIiMglBk4iIiIXGDiJiIiCJvL/ZQjsQYJ0opYAAAAASUVORK5CYII=) The Scripting Data components allow you to attach properties to an object without having the full Scripting Runtime. This can be useful when objects are created dynamically at runtime or meant to be interchangeable. Together with the Scripting Resources and Scripting Events components, you can effectively emulate the ability to create custom Unity components on an object with unique behaviors, properties, and resources attached to them. #### Fields[​](#fields "Direct link to Fields") ###### Data Variables[​](#data-variables "Direct link to Data Variables") add variables here. ###### Component Name[​](#component-name "Direct link to Component Name") the unique name field. --- ### Scripting Events #### Overview[​](#overview "Direct link to Overview") The Scripting Events components allow you to attach events to an object without having the full Scripting Runtime. ![](https://lh7-us.googleusercontent.com/D7c3oK_9DlcDqL6jr8ZYYXJ4UmFp4VFDHalQjpM1GmVLKO5CSswUrNJlewER8Ojf4emeXQAkn5ycdBbvmuI4FYn6N5c0TIQQS3ok9Las5tFbvjDoxoUFuzAY_Q0RG5Vt9QdOOaHcROxpdzZxoJ-WpSk) The Scripting Events components allow you to attach events to an object without having the full Scripting Runtime. This can be useful when objects are created dynamically at runtime or meant to be interchangeable. Together with the Scripting Resources and Scripting Events components, you can effectively emulate the ability to create custom Unity components on an object with unique behaviors, properties, and resources attached to them. #### Fields[​](#fields "Direct link to Fields") ##### Events[​](#events "Direct link to Events") The number of event elements ##### Element[​](#element "Direct link to Element") ###### Name[​](#name "Direct link to Name") The name of the element that can be used to call the element via code. ###### Event ()[​](#event- "Direct link to Event ()") The event ##### Usage[​](#usage "Direct link to Usage") Drag a object into the Object field and select a function for that object or a component attached to the object
--- ### Scripting Resources #### Overview[​](#overview "Direct link to Overview") The Scripting Resourse components allow you to attach resources to an object without having the full Scripting Runtime. ![]() The Scripting Resourse components allow you to attach resources to an object without having the full Scripting Runtime. This can be useful when objects are created dynamically at runtime or meant to be interchangeable. Together with the Scripting Resources and Scripting Events components, you can effectively emulate the ability to create custom Unity components on an object with unique behaviors, properties, and resources attached to them. #### Fields[​](#fields "Direct link to Fields") ##### Component Name[​](#component-name "Direct link to Component Name") The component name
##### Resources[​](#resources "Direct link to Resources") The number of event elements
##### Element Name[​](#element-name "Direct link to Element Name") The name of the element that can be used to call the element via code. ##### Element Object[​](#element-object "Direct link to Element Object") The resource itself #### Usage[​](#usage "Direct link to Usage") Drag a resource object into the Object field
--- ### Scripting Runtime #### Overview[​](#overview "Direct link to Overview") Fields Public Exposed Variables These are variables you want to be exposed to edit in edit room. ![](https://lh7-us.googleusercontent.com/yOCZ_eB43Q7ZHIqqjjK99JUPrN4tWO6Yu8sdeGc_joogDFImlBdslYcgfWwc7KEc8uEtzlZtZ1VYXZBi_jHWY3Fb3N4jqGwUKX5WKyn8eKlygM7onS5HIzRLjmboRDk74-geqb5tlRnYw0ISfATlvg) #### Fields[​](#fields "Direct link to Fields") Public Exposed Variables These are variables you want to be exposed to edit in edit room. Component Name The reference name of your script #### Source Code[​](#source-code "Direct link to Source Code") Script Contents Your code. Script Your code as a LUA file. Script Libraries Your code functions in a text file. Script Libraries 2 Your code functions in an LUA file. #### Execution Options[​](#execution-options "Direct link to Execution Options") Default Events Should be named functions such as OnUpdate, OnFixedUpdate, etc be handled implicitly? Reset Behaviour: Whether to reset on scene change or not Allow Runtime Script Editing: Allows the user to edit this script at runtime. Be aware runtime modified scripts are subject to additional sandboxing on the live environment. Debugger Attaches the VS Code Debugger, not usable on the live server. Will work in uploads. Beware, allowing debugging will allow \_any\_user to debug your script. Enabling the debugger will disable infinite loop protection, and maximum execution length aborts. Await the debugger: Wait for the debugger Wait for Player: This script will hold execution until the player has arrived in the scene. Scripts which do setup (i.e. procedural content) may want to execute straight away. Wait For Network: This script will hold execution until the payer has arrived and the scene is connected to the network server. Max Script Executions Per Tick: The maximum number of script calls that can occur per frame. Use coroutines to run something across multiple frames Index Indicates how arrays should be indexed. Defaults to Lua Standard (Index from 1). Load Libraries Sequentially Loads libraries one at a time, which is faster and gives better debug messages, if you use local variables that span across libraries, you cannot use this method. #### Unity Interfaces[​](#unity-interfaces "Direct link to Unity Interfaces") Resources Here you add resources used by your script (e.i. Materials, audio files, textures, etc) Events Here you create events that can be accessed (initialised) by your code. Object References Here you add objects that exist in the scene that you need to access using code. --- ### Extensions #### Overview[​](#overview "Direct link to Overview") List of 3rd party whitelisted extensions (such as Unity Asset Store items) | **Extension Name** | **Summary** | **Link** | **Works?** | **Officially supported?** | **Notes** | | -- List of 3rd party whitelisted extensions (such as Unity Asset Store items) | **Extension Name** | **Summary** | **Link** | **Works?** | **Officially supported?** | **Notes** | | --------------------------------- | ------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | ---------- | ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | AltTrees System | Terrain/Tree Placement | [Asset Store](https://www.assetstore.unity3d.com/en/#!/content/76657) | **Yes** | **No** | Requires editor pack 9.8 onwards | | Amplify Shader Editor | Node-based Shader Tools | [Asset Store](https://assetstore.unity.com/packages/tools/visual-scripting/amplify-shader-editor-68570) | **Yes** | **No** | Appears to work | | Archimatix Pro | Procedural/Parametric Building Tools | [Asset Store](https://www.assetstore.unity3d.com/en/#!/content/59733) | **Yes** | **Yes** | Works - and can be used to create objects that can be edited in-world! | | AQUAS Lite | Water System | [Asset Store](https://www.assetstore.unity3d.com/en/#!/content/53519) | **Yes** | **Yes** | Gaia compatible | | AQUAS | Water/River System | [Asset Store](https://www.assetstore.unity3d.com/en/#!/content/52103) | **Yes** | **Yes** | Gaia compatible | | Bird Flock Bundle | Bird Flock Simulator | [Asset Store](https://assetstore.unity.com/packages/3d/characters/animals/bird-flock-bundle-25576) | **Yes** | **No** | Appears to work | | Bird Flock Bundle 2 | Bird Flock Simulator | [Asset Store](https://assetstore.unity.com/packages/3d/characters/animals/bird-flock-bundle-2-71740) | **Yes** | **No** | Appears to work, tropical bird collection *(seen in Welcome Center)* | | CTS (Complete Terrain Shader | Terrain Shaders | [Asset Store](https://assetstore.unity.com/packages/tools/terrain/cts-complete-terrain-shader-91938) | **Yes** | **No** | Gaia compatible | | Erosion Brush | Terrain tools | [Asset Store](https://www.assetstore.unity3d.com/en/#!/content/27389) | **Yes** | **No** | Appears to work | | FBX Exporter | File Export Utility | [Asset Store](https://assetstore.unity.com/packages/essentials/fbx-exporter-101408) | **Yes** | **No** | Appears to work | | Fish School Bundle | Fish School Simulator | [Asset Store](https://assetstore.unity.com/packages/3d/characters/animals/fish-school-bundle-31110) | **Yes** | **No** | Appears to work | | Fog Volume | Fog/Cloud Effects | [Asset Store](https://www.assetstore.unity3d.com/en/#!/content/81802) | **Yes** | **Yes** | Works, see [this thread](https://forum.sine.space/threads/fog-volume-3-asset-how-to-setup-camera-for-sinespace.17281/) on the Sinespace forum for more info. | | Gaia | Procedural terrain tools | [Asset Store](https://www.assetstore.unity3d.com/en/#!/content/42618) | **Yes** | **No** | Appears to work | | Gem Shader | Shader | [Asset Store](https://assetstore.unity.com/packages/vfx/shaders/gem-shader-3) | **Yes** | **No** | Appears to work | | HerdSim | Animal Roaming Simulator | [Asset Store](https://assetstore.unity.com/packages/3d/characters/animals/herdsim-26648) | **Yes** | **No** | Appears to work | | Landscape Auto Material | High quality terrain shaders | [Asset Store](https://www.assetstore.unity3d.com/en/#!/content/64132) | **Yes** | **Yes** | Works on Desktop class platforms only | | LVE - Lava & Volcanic Environment | Flowing Lava/Volcanic Environment Assets | [Asset Store](https://assetstore.unity.com/packages/3d/environments/l-v-e-lava-volcano-environment-112703) | **Yes** | **No** | Appears to work | | MapMagic World Generator | Procedural Terrain System | [Asset Store](https://www.assetstore.unity3d.com/en/#!/content/56762) | **Yes** | **No** | Make sure to uncheck infinite terrain, and pin the terrain tiles you want to appear in Sinespace. | | MicroSplat Core | Terrain Shaders | [Asset Store](https://assetstore.unity.com/packages/tools/terrain/microsplat-96478) | **No** | **No** | Approved, but support has not yet been added. Does not support the rivers/streams module. Supported version is 2.4+. Other versions likely work. | | MicroSplat Tessellation Module | Terrain Shaders | [Asset Store](https://assetstore.unity.com/packages/tools/terrain/microsplat-tessellation-and-parallax-96484) | **Yes** | **No** | Appears to work | | MicroSplat Anti-tiling Module | Terrain Shaders | [Asset Store](https://assetstore.unity.com/packages/tools/terrain/microsplat-anti-tiling-module-96480) | **Yes** | **No** | Appears to work | | MicroSplat Global Texture Module | Terrain Shaders | [Asset Store](https://assetstore.unity.com/packages/tools/terrain/microsplat-global-texturing-96482) | **Yes** | **No** | Appears to work | | MicroSplat Snow | Terrain Shaders | [Asset Store](https://assetstore.unity.com/packages/tools/terrain/microsplat-dynamic-snow-96486) | **Yes** | **No** | Appears to work except footsteps | | MicroSplat Terrain Holes Module | Terrain Shaders | [Asset Store](https://assetstore.unity.com/packages/tools/terrain/microsplat-terrain-holes-97495) | **Yes** | **No** | use our own "Terrain Hole Punch" script instead of the AlphaHolePhysics one supplied | | MicroSplat TriPlanar UVs | Terrain Shaders | [Asset Store](https://assetstore.unity.com/packages/tools/terrain/microsplat-triplanar-uvs-96777) | **Yes** | **No** | Appears to work | | MicroSplat Texture Cluster | Terrain Shaders | [Asset Store](https://assetstore.unity.com/packages/tools/terrain/microsplat-texture-clusters-104223) | **Yes** | **No** | Appears to work | | MicroSplat Wind and Glitter | Terrain Shaders | [Asset Store](https://assetstore.unity.com/packages/tools/terrain/microsplat-wind-and-glitter-105627) | **Yes** | **No** | Partial support, no support for Glitter Light script | | Multiple Terrain Brush | Terrain tools | [Asset Store](https://www.assetstore.unity3d.com/en/#!/content/44037) | **Yes** | **No** | Appears to work | | Noise Brush | Terrain tools | [Asset Store](https://www.assetstore.unity3d.com/en/#!/content/28672) | **Yes** | **No** | Appears to work | | Octave3D | Prefab Management/Placement Tool | [Asset Store](https://assetstore.unity.com/packages/tools/level-design/octave3d-level-design-45021) | **Yes** | **No** | Appears to work | | PA Particle Field | Volumetric particle fields | [Asset Store](https://www.assetstore.unity3d.com/en/#!/content/33271) | **Yes** | **Yes** | Desktop & Console platforms only | | Path Painter | Terrain Tools | [Asset Store](https://assetstore.unity.com/packages/tools/terrain/path-painter-127506) | **Yes** | **No** | Gaia compatible, Appears to work | | PolyBrush | In-Editor 3D Modelling | [Asset Store](https://assetstore.unity.com/packages/3d/polybrush-beta-111427) | **Yes** | **No** | Free! Recently acquired by Unity, will be integrated into Unity Editor in future releases but currently must be purchased as free asset. | | ProBuilder | In-Editor 3D Modelling | [Asset Store](https://assetstore.unity.com/packages/tools/modeling/probuilder-111418) | **Yes** | **No** | Free! Recently acquired by Unity, will be integrated into Unity Editor in future releases but currently must be purchased as free asset. | | ProGrids | In-Editor 3D Modelling | [Asset Store](https://assetstore.unity.com/packages/3d/progrids-111425) | **Yes** | **No** | Free! Recently acquired by Unity, will eventually be integrated into Unity Editor but currently must be purchased as free asset. | | RAM (River Auto Material) | River/Water Solution | [Asset Store](https://assetstore.unity.com/packages/tools/terrain/r-a-m-river-auto-material-101205) | **Yes** | **No** | Gaia compatible | | Real Ivy | Procedural Ivy Tool | [Asset Store](https://www.assetstore.unity3d.com/en/#!/content/86134) | **Yes** | **No** | Appears to work | | Relief Terrain Pack | Terrain Shaders | [Asset Store](https://www.assetstore.unity3d.com/en/#!/content/5664) | **Yes** | **No** | Appears to work | | SpeedTree | Tree & Plant Modeller (external program) | [Website](http://www.speedtree.com/) | **Yes** | **No** | Modeler allows you to create your own trees, as well as edit existing SpeedTrees. Note, the trees themselves (SpeedTrees files) work natively in Unity. | | Suimono | Interactive Water Solution | [Asset Store](https://www.assetstore.unity3d.com/en/#!/content/4387) | **Yes** | **Yes** | Works but has a number of unresolved issues, see [this thread](https://forum.sine.space/threads/suimono-and-sinespace.17184/#post-18172) on the Sinespace forum for more info. | | Super Pivot FREE | Editor Utility | [Asset Store](https://assetstore.unity.com/packages/tools/utilities/super-pivot-free-modifier-104882) | **Yes** | **No** | Free! basic pivot point adjustment tool, Appears to work | | Super Pivot PRO | Editor Utility | [Asset Store](https://assetstore.unity.com/packages/tools/utilities/super-pivot-pro-modifier-74211) | **Yes** | **No** | Full-featured pivot point adjustment tool, Appears to work | | TerrainComposer 2 | Procedural terrain tools | [Asset Store](https://www.assetstore.unity3d.com/en/#!/content/65563) | **Yes** | **No** | Appears to work | | UModeler Trial Version | In-Editor 3D Modelling | [Asset Store](https://assetstore.unity.com/packages/tools/modeling/umodeler-2-0-free-trial-111465) | **Yes** | **No** | Limited version in-editor 3D modeling tool. | | UModeler | In-Editor 3D Modelling | [Asset Store](https://assetstore.unity.com/packages/tools/modeling/umodeler-2-0-80868?aid=1011l36n8) | **Yes** | **No** | Powerful in-editor 3D modeling and prototyping software with 90 tools to help make creating, transforming and editing your model a breeze in Unity. | | UMotion Community | Animation Editor | [Asset Store](https://assetstore.unity.com/packages/tools/animation/umotion-community-animation-editor-95986) | **Yes** | **No** | Animation Editor, appears to work. | | UMotion Pro | Animation Editor | [Asset Store](https://assetstore.unity.com/packages/tools/animation/umotion-pro-animation-editor-95991) | **Yes** | **No** | Animation Editor, appears to work. | | USequencer | Powerful cutscene editing | [Asset Store](https://www.assetstore.unity3d.com/en/#!/content/3666) | **Yes** | **Yes** | Supported until 2018. Some items (e.g. Load Level) unsupported. | | Vegetation Studio | Tree/Vegetation Shaders | [Asset Store](https://assetstore.unity.com/packages/tools/terrain/vegetation-studio-103389) | **Yes** | **No** | Approved, but support has not yet been added. | | Vertex Paint | Vertex Editing Tool | [Github](https://github.com/slipster216/VertexPaint) | **Yes** | **No** | Appears to work | | Visualizer Studio | Audio visualization | [Asset Store](https://www.assetstore.unity3d.com/en/#!/content/1761) | **Yes** | **Yes** | Officially supported, can use built-in space equivalents as well. | | Volumetric Crystal Materials Pack | Gem Shaders | [Asset Store](https://assetstore.unity.com/packages/vfx/shaders/substances/volumetric-crystal-materials-pack-105951) | **Yes** | **No** | Appears to work | | Voxeland | Volumetric terrain tools | [Asset Store](https://www.assetstore.unity3d.com/en/#!/content/9180) | **Yes** | **No** | Works for non-infinite terrains. Make sure to use 'Save data to .asset' before uploading. | | World Machine | Procedural terrain tools (external program) | [Website](http://www.world-machine.com/) | **Yes** | **No** | Appears to work | --- ### Setup #### [πŸ“„οΈLink Space and Unity](/sinespace-sdk/setup/link-space-and-unity.md) [Link Space and Unity Get API Key Log in with your Space account at https://curator.sine.space/ Go to Settings / API keys.](/sinespace-sdk/setup/link-space-and-unity.md) --- ### Creating a New Folder inside Project #### Overview[​](#overview "Direct link to Overview") In the Project window, there will be a list of folders. In the Project window, there will be a list of folders. To create a new folder within this project, simply click on the **Create** button and choose Folder from the menu, OR right click the main folder, and choose **Create** then Folder. If you have the Editor Pack as your project, always make sure you make a new folder within the **Assets** folder for anything you are modelling. --- ### Creating a Project #### Overview[​](#overview "Direct link to Overview") When Unity is started on your PC, a pop up window will appear. When Unity is started on your PC, a pop up window will appear. This is where you create a new project. To create a new project, click on the **New** button. Put in a project name and choose a location for the project files to go. **Choose 3D** for the assets. Click **Create Project**. ![Createproject.jpg](/assets/images/createproject-d9bd15b92462d988f9b7b4528423e221.jpg) --- ### Creator signup through SDK #### Overview[​](#overview "Direct link to Overview") If you are ready to upload content from Unity and "have not" created your avatar account yet you can do so within Unity If you have already made a creator account, you do not need If you are ready to upload content from Unity and "have not" created your avatar account yet you can do so within Unity If you have already made a creator account, you do not need to make one, you can just sign in with our editor pack you installed in Unity. Once it is installed, to make your Creator account, click on the 'Sinespace' button on the Unity top bar then 'Sign In'. ![UnitySignin.png](/assets/images/unitysignin-44de3241b68c83d55fabf8dd3b8c0481.png) In the Inspector, you will see the Sinespace Login Information, along with a button 'Create an account'. Click on this button. ![Editorcreateaccount.png](/assets/images/editorcreateaccount-a24819a4656a1e9875bb907e4fbe8fce.png) It will take you to the Creator signup page. Here you can choose a default avatar and enter a username, your email address and password. Once you have clicked on the 'Join now' button, it will take you to the viewer download page. Once here, click on the 'Become a Creator'. Fill in all the information under the 'Join our creator program' section. Because you have already made an account, it will auto-fill your email address. Once this is filled in, click on the Join Creator Program button, and you're now a Creator! You can go back to the Sign in option in Unity and use your username and password to log in. This will generate a unique API key which enables uploading to Sinespace. --- ### Creator signup through web #### Overview[​](#overview "Direct link to Overview") If you already have an avatar account skip to Step2 Step 1.Make a creator account To become a creator, visit our Creator Signup page. #### If you already have an avatar account skip to Step2[​](#if-you-already-have-an-avatar-account-skip-to-step2 "Direct link to If you already have an avatar account skip to Step2") #### Step 1.Make a creator account[​](#step-1make-a-creator-account "Direct link to Step 1.Make a creator account") To become a creator, visit our [Creator Signup](https://sine.space/creator/) page. Scroll down until you see this box, and click on the button highlighted in red: This will take you to the signup page. On here, choose your avatar from the left hand side (you can scroll through the choices with the arrows) and on the right hand side you can enter a username, email address and password. Please make sure you use an active email address as we will send you a verification email here. Click the Join now button when you have entered the information. This will take you to the Download page. You can download the viewer from here, but you will also need to click on the 'Become a Creator' button: This will take you to the Creator page. Once here, you can fill in all the information under the 'Join our creator program' section. Because you have already made an account, it will auto-fill your email address. Once this is filled in, click on the Join Creator Program button, and you're now a Creator! #### Step 2.Install Unity Editor[​](#step-2install-unity-editor "Direct link to Step 2.Install Unity Editor") See [Unity Installation](/quickstart-sinespace-viewer/get-started-sdk/sdk-setup.md) for the current version and installation walk through. **Please note: we use a specific version (or range of versions) of the Unity editor, see the [Unity Installation](/quickstart-sinespace-viewer/get-started-sdk/sdk-setup.md) page for more details. Other versions may not work.** #### Step 3.Download and install the Space Editor Pack[​](#step-3download-and-install-the-space-editor-pack "Direct link to Step 3.Download and install the Space Editor Pack") The Space Editor Pack is an add-on for Unity which allows you to upload your content to Sinespace and contains all of the necessary components you will need for various content. You can find the Editor Pack versions and installation guide on our [Editor Pack](/sinespace-sdk/setup/download-editor-pack.md) page. #### Step 4.Enable Editor Pack Settings[​](#step-4enable-editor-pack-settings "Direct link to Step 4.Enable Editor Pack Settings") With the editor pack now installed, you will see a new button called 'space' in the top menu. click on Space / Install Editor Pack Settings to enable the editor pack settings. #### Step 5.Sign in to space in your Unity project[​](#step-5sign-in-to-space-in-your-unity-project "Direct link to Step 5.Sign in to space in your Unity project") In the top menu, click Sinespace -> Sign in... Then in the Inspector window on the right log in with the username and password you created at sine.space (above). You might have to switch from the Services window to the Inspector window. In the next screen Add your real name, a business name if you have one, review and accept the EULA for content creators. [End User License Agreement](/policies/end-user-license-agreement.md) 1. Accepting the EULA will allow you to access the creator server. Until you complete this step you will only have access to the live server. #### Step 6. Upload a sandbox region[​](#step-6-upload-a-sandbox-region "Direct link to Step 6. Upload a sandbox region") [Watch on YouTube](https://youtube.com/watch?v=Lmh5VWBsJB8) Follow the video tutorial on how to set up a basic region to use as a sandbox region. 1. Congratulations! You are now ready to create and upload content to Sinespace! #### Getting Help[​](#getting-help "Direct link to Getting Help") We're happy to assist , just grab us in our [Discord Channel](http://discord.gg/sinespace). We have various channels that both staff and fellow creators can help you with questions. --- ### Download Editor Pack #### Overview[​](#overview "Direct link to Overview") Installing the editor pack 1. To install the editor pack you will need to have installed the Unity editor. #### Installing the editor pack[​](#installing-the-editor-pack "Direct link to Installing the editor pack") 1. To install the editor pack you will need to have installed the Unity editor. Please see [SDK Setup](/quickstart-sinespace-viewer/get-started-sdk/sdk-setup.md) to check information on Unity versions To access the SDK/Editor pack you will need to [create an account](https://id.unity.com/en/conversations/70ea6f07-b73b-4b6e-b1a2-80e02aa2777f002f) with Unity to access the Unity Asset Store. You can download directly from the [Asset Store](https://assetstore.unity.com/packages/templates/systems/sinespace-137731) and add to your list of available assets or in your open unity project. When you have an asset in your available list you will see an import button in the asset store tab within Unity instead of a download and then import. To download from your open Unity project, click on the Asset store tab, you will need to be logged into your Unity account, search for Sinespace and download the SDK package. Press the download button, when it has downloaded, click on the Import button. When the Import Unity Package window comes up, **leave everything ticked **and click on the Import button. When it is ready to import it will ask if you want to install the Editor Pack. Click on the Install Editor pack button when it asks. It will ask again to Import, click on the Import button. It will import all of the files needed. You may have to press the restart button if promoted to. You could be asked to restart a few times to fully install the Editor Pack, this is normal. When it has imported fully, click on the Sinespace button at the top of Unity. Click on 'Install editor pack settings'. Once this is done, you can click on Sinespace again and click on 'Sign in'. Use the username and password you used to sign up for Sinespace creator here as this will allow you to upload your content to Sinespace. #### Editor pack versions[​](#editor-pack-versions "Direct link to Editor pack versions") * Please do bear in mind that the SDK/Editor Pack does include Unity version 2018.3 however the relevant editor pack is experimental\*\*. #### Attention Mac users[​](#attention-mac-users "Direct link to Attention Mac users") After the Editor Pack has been installed, you will either need to install the Native Mac Uploader *(recommended)* or the legacy mono framework version 4.8.0.382 *(click [here](https://download.mono-project.com/archive/4.8.0/macos-10-universal/MonoFramework-MDK-4.8.0.382.macos10.xamarin.universal.pkg) to download).* Installing the Native Mac Uploader is easy, simply click on the **\_SineSpace --> Tools --> Install --> Native Mac Uploader**\_ menu option. This process will take a little time, but should be completely automated and you will receive a message once the uploader has been successfully installed. --- ### Link Space and Unity #### Overview[​](#overview "Direct link to Overview") Get API Key Log in with your Space account at Go to Settings / API keys. #### Get API Key[​](#get-api-key "Direct link to Get API Key") Log in with your Space account at Go to Settings / API keys. Generate and API key and copy it. ![Api key.jpg](/assets/images/api-key-03cc5070aa37734ab5f3fd607d66a00a.jpg) #### Paste API Key[​](#paste-api-key "Direct link to Paste API Key") Go to your Unity project and in the top bar menu select Space / Upload Settings. ![Upload settings.jpg](/assets/images/upload-settings-a1bdc9ed0309edc8ca55c0a8c7428bb2.jpg) This will open a field in the Inspector (usually on the right in Unity) ![Curator key.jpg](/assets/images/curator-key-156a60f4613a998b4ccc22ac912fe37d.jpg) Paste your API here and click check to verify. This links your Unity project to your account; everything you upload from the project will now go to the same account; that can be multiple scenes and other virtual goods. --- ### Re-importing the Editor Pack #### Overview[​](#overview "Direct link to Overview") You will need to re-import the Editor Pack if you have installed a newer version of Unity or if you have have upgraded to a newer version of the Space Editor Pack. You will need to re-import the Editor Pack if you have installed a newer version of Unity or if you have have upgraded to a newer version of the Space Editor Pack. To re-import the editor pack, first, navigate to the folder in which you have downloaded the Editor Pack. Double click on the Editor Pack in this folder. This will open Unity, and a **Create Project** window will appear. Name the project, choose where it will be saved, *and choose 3D* (important!). Click on **Create Project**. Clicking on Create Project will open Unity, and Unity will start to prepare the Editor Pack package for import. Once this is done, you will have the Editor Pack installed again in Unity. You can also open Unity, go to the top menu, choose Assets>Import Package>Custom Package and choose the Editor Pack from where it is saved after downloading. This will start the prepare and import the same as the above way of re-importing, but an **Import Package** pop up will show, asking you to import items. Choose all of the items to re-import. --- ### Vehicles #### Overview[​](#overview "Direct link to Overview") Please notice there are two versions of script for Vehicles: the old ones are the scripts like "car physics", "car vehicle", which are obsolete; the new vesion is one script called Please notice there are two versions of script for Vehicles: the old ones are the scripts like "car physics", "car vehicle", which are obsolete; the new vesion is one script called "Modular Vehicle", it combines all kinds of vehicle together(land, hover, boats) so you can adjust this one script for all types of vehicle settings. The new version resolved many bugs of the old version, so we recommand to use the new one. We will still keep the tutorial of old version in other pages, you can always check them if you need. Note: This page is still updating so there may be some place incomplete during this moment. ##### Simple guide for a land vehicle[​](#simple-guide-for-a-land-vehicle "Direct link to Simple guide for a land vehicle") To start create a land vehicle, you should find yourself a vehicle model.
To prepare a model for vehicle, whether you want create one using MAYA or 3DMAX or Blender, or find a model from Unity asset store, there are somethings you should pay attention to:
*Make sure the wheels are splited from the vehicle body. Some vehicle in asset store has a single FBX file combined all the things together, which makes the next steps quite impossible if we don't do something to the model.* As an example, we choose a simple low-poly car in the asset store(which the server can proceed faster) like this:\\ ![](/assets/images/ToonCar-6e0aad85a72b244268f935dd857dc032.png) You can always choose a vehicle more realistic and complex, but there may be more details need to adjust on your own. ![](data:image/png;base64,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) Preparation:
Create and organise the objects for the vehicle like this:\\ Carbody is the body of the car, not including the wheels.
Seat is an empty object here, and it defines where your avatar sits in the car.
The wheel group contains the 4 wheels, and the wheel collider group contains the wheel colliders for each wheel.
*The positions of the wheel colliders need to adjust individually, so they should be created separately from the wheels. You can do it by creating an empty gameobject then adding a wheel collider component, duplicating 3 more, and renaming them.* *** Choose the parent object of the whole car, then add a script named "Modular Vehicle". A rigidbody component will be added automatically as well.
As a simple guide, it will only show you how to make a car which can be driven in the game. There are a few more stuffs in the script settings but we will ignore them here. ![Modular vehicle.png](/assets/images/modular-vehicle-32d017a74a54e25fe110294fcd5cead4.png) Set the "Seat Root" with the seat gameobject, and Ride Animation you can get it from [Mixamo](https://www.mixamo.com/) freely.
The Mass will be the weight of your car, the value here only shows an example.
*Note: there is also a Mass property in Rigidbody component, change it to the same value.*
The Center of gravity concerns the stability of the vehicle. If you want to create a big truck, making it a little lower may be better(like (0, -1.25, 0)), otherwise just leave it to default.\\ These are the 'core forces' settings. They configure the vehicle 'overall'. Everything else is pretty much 'per wheel'. ![Core forces.png](/assets/images/core-forces-6a6b724fbb6106b39d500d879cfdeef0.png) Our example is a regular 4-wheel car, so we set the number of wheels as 4. If you are creating a vehicle with a different number of wheels, just enter the wheel number here -- and make the same number of wheel colliders. ![Wheels.png](data:image/png;base64,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) This is a representative front wheel. The other uses the same values with its own transform and collider. ![Wheel0.png](/assets/images/wheel0-65fa15abc5135fa3e648a7daab5f119a.png) This is a representative rear wheel. Same for the values, it's just on the other side. ![Wheel2.png](/assets/images/wheel2-0a593d17651cf1c11d3c27663092b7ed.png) In this example, the front and rear wheel is in different size(it's a race car, somehow), so the mass and radius are different. For a normal car, they might be the same value.
This is the collider for the rear wheel. It will be the same on the other side. Differences are in the name and position on the model. This applies generally to all the wheel elements. ![Wheelcollider rear.png](/assets/images/wheelcollider-rear-fb5fb0520ad2df1c113054af7a12ac3a.png) This is the collider for the front wheel. ![Wheelcollider front.png](/assets/images/wheelcollider-front-ea0ea374926f599d8134a561b3c88b4d.png) After set the values, you should adjust its position and size manually. Make the radius match the size of wheel then modify the collider's postion to the center of the tire. Like this: ![Wheelcollider position.png](/assets/images/wheelcollider-position-c64756ecb2c173ed1461e1b6963c1525.png) ![Wheelcollider position2.png](data:image/png;base64,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) \\ If you want to add tire track, here's a image from the old version, but it's always the same way. ![Redtruckrearwheeltrailrenderer.png](/assets/images/redtruckrearwheeltrailrenderer-0256d1af5844f9d7e29cd91c9e12676b.png) Finally, add a box collider in the parent object, make sure it doesn't have conflict with the wheel colliders. ![Car boxcollider.png](/assets/images/car-boxcollider-8003c432850f76922a24d2f98a415174.png) Forget this will make your vehicle cannot trigger the clickable events(which equals cannot drive it). Now you can add a virtual good component to the parent object to upload and test it. *** *The hover points and boat forces are for hover type and boat type, which is still under testing now.* ##### Hover[​](#hover "Direct link to Hover") *The example below is only a prototype, it can float and move, but the performance is not very satisfied. The value settings may be complex here, which may need you to adjust by yourself. Feel free to update this part if you find a more simple way to create a hover car.*\\ Same as the land type, we found another model from asset store, and just turn the tires 90 degree, like this: ![Hover car.png](/assets/images/hover-car-80bf08f80caf73e6957da37fecd60ca8.png) There won't be other collider, so a box collider covers the whole car body is enough.
Its parts could be organized like this: ![Hovercar parts.png](data:image/png;base64,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) The four wheels here will be the 4 hover points, which will be defined later.\\ Like create a land type vehicle, just add a modular vehicle to the parent object. ![Hovercar component.png](/assets/images/hovercar-component-8812ed48553b8d7a08058f1fdd595cf3.png) *It seems there is a little bug that the mass in modular vehicle doesn't override the mass of rigidbody, so we use the mass value in rigidbody instead.*
These basic settings are same as the land type.
Core force settings: ![Hovercar coreforce.png](/assets/images/hovercar-coreforce-310ad6a994452aab2fe9f3725d3f7097.png) ![Hovercar coreforce2.png](/assets/images/hovercar-coreforce2-0fa71ec45bc048b37ec035b9dbd7ab1b.png) ![Hovercar coreforce2.png](/assets/images/hovercar-coreforce2-0fa71ec45bc048b37ec035b9dbd7ab1b.png) ![Hovercar coreforce2.png](/assets/images/hovercar-coreforce2-0fa71ec45bc048b37ec035b9dbd7ab1b.png)
*These values are experimental. Feel free to update it if you find a better example.*
Hover points: ![Hovercar hoverpoints.png](/assets/images/hovercar-hoverpoints-d04f72e14aeafcfd918b2422672514fb.png) Here need some physical tricks and calculations. The Unity physic system defines the Gravitational acceleration is 9.81 m/sΒ², we set the rigidbody mass is 100(the unit is kg, normally), so the weight is 9.81 \* 100 = 981 N. We have 4 hover points, so we seprate a up force of 981N to these 4 hover points, that is, each hover point take a 245.25N in up direction. This should keep the hover car float in the air. Of course, if you want to increase or decrease the number of hover points, you shoud modify the force each hover point too.\\ Add the virtual good component and upload it, now you can test it on the preview server.\\ ![Hovercar sample.png](/assets/images/hovercar-sample-3219abb9510fd0abacd8d4229ff6e7ef.png) *** ##### Boat[​](#boat "Direct link to Boat") PENDING *** ##### Events[​](#events "Direct link to Events") If you want to add some additional functions to your vehicle, like the speed meter and rear-view camera which introduced below, please make sure that you've add the events control for them. For example if you want the function only active when the player drive the car and deactivate them when the player leave, you need to add events in the On Player Activate/Deactivate function block, like the image below:\\ ![ModularVehicleEvents.png](/assets/images/modularvehicleevents-1d031cae5c50428dc1a6abfc55981002.png) *** ##### Speed meter[​](#speed-meter "Direct link to Speed meter") There is already a script called "speedometer" in the Editor Pack, all you need is create a UI Text Component under your vehicle object, and another empty game object with this speedometer component. Attach the rigidbody of the vehicle and the UI Text component to the slots of the speedometer, you can leave the rest option as it was, or fill it on your own request. Change the position and style of the UI Text as a normal UI element as you wish. And, remember, disabled the Canvas object at the beginning, and activate it by the events function as I present above.
A simple example here, is a meter with blue text in the right-bottom corner:\\ ![Speedmeter.png](/assets/images/speedmeter-c66477717b7cc87e852bbdc137009849.png) *** ##### Custom Camera[​](#custom-camera "Direct link to Custom Camera") Sometimes you may want set the camera for vehicle by yourself, or have several cameras to switch(you may need add custom script by using scripting runtime for the switch function though), like far view behind, close view behind, driver view, etc. To do this, you need to use the plug-in which is already contained in the Editor pack: Cinemachine Virtual Camera.
Simply create an empty game object in the vehicle object, and add the component Cinemachine Virtual Camera to it. Drag it to the Primary camera slot in Modular Vehicle, just like this: ![VehicleCustomCamera.png](/assets/images/vehiclecustomcamera-5d8d3eca4774092ffb29b8b74360caad.png) If you want to add a second or more camera, just set the number of the Secondary cameras then drag the cameras to each slot, like the example above.
Don't forget to adjust the parameter of your virtual camera or it won't work, here is an example: ![VehicleCustomCameraPrimaryExample.png](/assets/images/vehiclecustomcameraprimaryexample-378133f4a6d99542eb8cd88a04263d72.png) For the details of how to adjust the virtual camera and how to set those values here, check this [*tutorial video*](https://youtu.be/Sd7SmwF_X8U?t=1954).
And you also need to disable all of the Cinemachine Virtual Camera at the beginning, or it will bind your camera to them as soon as your vehicle is spawned. *** ##### Rear View[​](#rear-view "Direct link to Rear View") You may also want add a rear view to your vehicle, so the driver can take a clear look of his behind. The method is simple:
First, in your assets folder, right click the mouse and create a new render texture. ![CreateRenderTexture.png](/assets/images/createrendertexture-391289b6c8b359ac7ab68625da92ce4e.png) Leave the settings as its default if you don't have any other request.
Second, create a new camera in the prefab. The normal camera, not the virtual one we used above.
Then rotate it horizontally, make it face to the behind of the vehicle, and move it to the end of the car, make sure there is nothing block the camera.
Drag the render texture we create to the Target texture slot. And disable the camera component. ![VehicleRearCamera.png](/assets/images/vehiclerearcamera-d331ea3780a5a895275e2bf33bc632d3.png) Now in the canvas we used to show the speed meter, add a raw Image and attach that render texture into the slot: ![VehicleRearViewRawImage.png](/assets/images/vehiclerearviewrawimage-989a3a416b60529ea6809fdd5d366670.png) And Finally in-game, we can get a simple rear view of the behind:\\ ![VehicleRearViewInGame.png](/assets/images/vehiclerearviewingame-9ed24ac900d6b2a3944195d43d95eefb.png) You can use image mask to add a form of rear mirror to make it look beautiful, for more information, take a look at this [*Unity Beginner Tutorial*](https://unity3d.com/learn/tutorials/topics/user-interface-ui/ui-mask). *** ##### Tutorial for obsolete vehicle script[​](#tutorial-for-obsolete-vehicle-script "Direct link to Tutorial for obsolete vehicle script") [Land vehicles](/sinespace-sdk/vehicles.md)
[Aircraft and Gliders](/sinespace-sdk/vehicles.md)
[Hover Vehicles](/sinespace-sdk/vehicles.md)
[Watercraft and Boats](/sinespace-sdk/vehicles.md) --- ## Sinespace Viewer ### Sinespace Viewer #### [πŸ—ƒOutfits](/sinespace-viewer/outfits.md) [1 item](/sinespace-viewer/outfits.md) --- ### Account #### Overview[​](#overview "Direct link to Overview") To become a Space creator you need to; 1. To become a Space creator you need to; 1. Register at 2. Log in to the creator portal; 3. Download and install the Unity3D game engine; 4. Download and import the Space Editor Pack; #### Sine.space[​](#sinespace "Direct link to Sine.space") The Space virtual world has a live server; This is where the Space community comes together. The live server has a real economy and is widely promoted to new users. Space also has a preview server, where creator content can be reviewed before pushing to the live servers; #### Creator portal[​](#creator-portal "Direct link to Creator portal") The creator portal allows creators to buy regions in Space and to manage their income from the sale of virtual goods; #### Unity3D[​](#unity3d "Direct link to Unity3D") Creators can use the Unity3D game engine to upload their work; regions, clothing, gestures and numerous other types of virtual goods. Unity is a powerful game engine that allows creators to build regions and virtual goods to the same quality standard as contemporary AAA game titles. #### Space Editor Pack[​](#space-editor-pack "Direct link to Space Editor Pack") The Space Editor Pack must be imported into Unity3D. This will link the Unity project on the creator's desktop to their Space account. And it provides a wide range of tools to enable creators to build, productise and publish, share and sell their work. --- ### Auctions #### Overview[​](#overview "Direct link to Overview") Auctions Click the AUCTION button in the bottom menu to open the auction window. #### Auctions[​](#auctions "Direct link to Auctions") Click the AUCTION button in the bottom menu to open the auction window. 1. All Auctions See everything being offered for auction and bid on items you like. 1. My Bids Track items you are bidding for and raise your bids here. 1. My Auctions Put any item from your inventory up for auction; perfect for unique items you have crafted inworld, including custom pets and customized clothing items. --- ### Audio Streaming #### Overview[​](#overview "Direct link to Overview") Audio Source - What audio can be streamed and where from? ##### Audio Source - What audio can be streamed and where from?[​](#audio-source---what-audio-can-be-streamed-and-where-from "Direct link to Audio Source - What audio can be streamed and where from?") This could be some software on your PC or tablet or phone. It could also be an external music player such as an iPod or a record player with it's output going to your PC's Line-In socket. So long as Windows is playing it then that's what will be streamed. Typically a DJ would use [VirtualDJ](https://www.virtualdj.com/download/) software. This is free for non-commercial use. That's covered briefly how to play the audio. ##### The Streaming Software - So, we currently have our songs playing but what else do we need?[​](#the-streaming-software---so-we-currently-have-our-songs-playing-but-what-else-do-we-need "Direct link to The Streaming Software - So, we currently have our songs playing but what else do we need?") Something needs to convert it to a true MP3 radio stream and then send it up to the internet. This is where software such as [WinAmp](https://download.nullsoft.com/winamp/client/winamp58_3660_beta_full_en-us.exe) comes in. WinAmp should be set to "Soundcard Input". The other software needed is a DSP Shoutcast plugin, that converts the audio to be shoutcast compatible. The DSP Plugin runs inside WinAmp, so install both - they are both free to use. ##### The Radio Stream Host.[​](#the-radio-stream-host "Direct link to The Radio Stream Host.") So we're sending sound up to the internet, but where do we send it? For this you will need to either use a free service (not recommended) or a paid service for a shoutcast radio stream. There are a few pieces of configuration information that you will get from here. This info will need to be entered into the DSP plugin above. Crucially this will be login information to connect from your audio source (your PC's sound) to your stream and the settings you need to play your stream in Sinespace. ##### The Radio Stream Player - How do I get it to play in Sinespace?[​](#the-radio-stream-player---how-do-i-get-it-to-play-in-sinespace "Direct link to The Radio Stream Player - How do I get it to play in Sinespace?") There are a number of ways. Firstly the ability to set your own region to a specific stream is now built into the viewer. Secondly, you might elect to just buy a furniture prop from the in-world shop that is a radio stream player. Third option would be to actually script your own radio player inside Unity using our SDK and making your own. Format of MP3 stream URL. The general rule is:- Stream ip address : port number such as 203.432.32.345:7589 203.432.32.345 is the IP address and 7589 is the port number Separated by a single colon. (:). Sometimes the url supplied by the radio streaming company might not always conform with our players but we can usually find a way around that by restructuring the URL. --- ### Communication #### Overview[​](#overview "Direct link to Overview") Chat The chat system allows you to communicate with the entire virtual world, just people in your region or specific people. #### Chat[​](#chat "Direct link to Chat") The chat system allows you to communicate with the entire virtual world, just people in your region or specific people. The world and region channels are always visible in your chat window. To open a chat with a specific individual, go to their PROFILE and click the CHAT button at the top. #### Mail[​](#mail "Direct link to Mail") You can send inworld email messages to anyone in Space, via the MAIL button in their PROFILE. You can see notifications in the top right bar when you receive email messages. #### Email attachments[​](#email-attachments "Direct link to Email attachments") You can send attachments via email; this is a great way to share content; and you can add an offer price to an attachment so you can trade inworld. #### Voice Chat[​](#voice-chat "Direct link to Voice Chat") Voice Chat is only supported the Windows and Mac version now. The support for WebGL is still on developping, and Linux is not supported. Click the sound source icon in the bottom left to enable voice chat. You will see a green icon above the heads of everyone in the region using chat. You can click the head button in the avatar inspector to easily focus on the faces of people talking. --- ### Explore #### Overview[​](#overview "Direct link to Overview") Explore Click the EXPLORE button in the bottom tab to open the explore window. #### Explore[​](#explore "Direct link to Explore") Click the EXPLORE button in the bottom tab to open the explore window. There are three categories for regions; 'Featured', 'Popular' and 'Friends'. The Featured list shows mostly Sinespace owned regions, but it does show some of the most popular creator regions as well. Popular is where you will find the most visited regions, and Friends will show all of your friends' homes and regions. To enter one of these regions, click on the 'Enter' button next to the region image. To get back to the Welcome Center, you can click on 'Explore' again, find the Welcome Center and click on 'enter'. If you are wanting to find and visit a specific region, you can use the 'search bar' above the Featured, Popular and Friends tabs.
#### Friends' Regions[​](#friends-regions "Direct link to Friends' Regions") You can also see a list of each of your friend's active regions by clicking the HOME button in their PROFILE. Or by clicking EXPLORE (bottom menu) and then clicking the FRIENDS tab. #### Region Info[​](#region-info "Direct link to Region Info")


--- ### Friends #### Overview[​](#overview "Direct link to Overview") Making Friends You can friend someone via the ADD FRIEND button on their PROFILE. #### Making Friends[​](#making-friends "Direct link to Making Friends") You can friend someone via the ADD FRIEND button on their PROFILE. You can open their PROFILE by clicking on them if you are both in the same region, and clicking MORE expanding the mini PROFILE in the top right corner of the screen. #### Unfriending[​](#unfriending "Direct link to Unfriending") Use the same button in any user's PROFILE to unfriend them. #### Friends list[​](#friends-list "Direct link to Friends list") The FRIENDS LIST shows all your friends and everyone in the same region as you. FRIENDS LIST shows who is online and who is offline. It also allows you to open the PROFILE of any friend. You can also click from the friends list to go directly to the AVATAR INSPECTOR of anyone in the same region as you. #### Friends' Regions[​](#friends-regions "Direct link to Friends' Regions") You can see a list of each of your friend's regions by clicking the HOME button in their PROFILE. Or by clicking EXPLORE (bottom menu) and then clicking the FRIENDS tab. #### Teleporting Friends[​](#teleporting-friends "Direct link to Teleporting Friends") Teleport friends to you via the TELEPORT button in their PROFILE. --- ### Hot Bar #### Overview[​](#overview "Direct link to Overview") Hot Bar You can drag any item from your inventory into the hotbar on your interface screen. #### Hot Bar[​](#hot-bar "Direct link to Hot Bar") You can drag any item from your inventory into the hotbar on your interface screen. You can also drag other items over existing ones on the hot bar to replace them. This allows you to then launch that item instantly from the hotbar. This is great for gestures and dances, or for quick changes of clothing items such as attachments. (clothing items will need to be removed through the outfit tab) *** --- ### Inventory #### Overview[​](#overview "Direct link to Overview") Inventory Click inventory to review and use everything you own. #### Inventory[​](#inventory "Direct link to Inventory") Click inventory to review and use everything you own. You can click items to discard or to deploy them inworld; add clothing items to your avatar, launch gestures or spawn vehicles and other scene objects. Some regions are set to prevent objects from spawning but you can launch gestures, including multi-person gestures, anywhere. If you have just bought an item and you cannot immediately see it in inventory try clicking the refresh button in the top of the inventory window. You will see all the clothing items you own in inventory; including items that are for skeletons or genders other than the one you are currently using. --- ### Keybindings #### Overview[​](#overview "Direct link to Overview") Here are few short cut keys that you can use in Space in Desktop build. Here are few short cut keys that you can use in Space in Desktop build. * Note\*\*: we will be adding more short cut keys and update here. #### Flying[​](#flying "Direct link to Flying") To start flying you can press "**R**" key. Once your character is hovering press "**E**" Key to go higher, or "**C**" to go Lower. You can hold **Shift** key while flying to fly faster; same key can be used while walking to run. #### Show Performance of a region[​](#show-performance-of-a-region "Direct link to Show Performance of a region") This is a hidden key which shows a profiler showing the performance of a region. To toggle this window Hold "**Shift**" Key and press **\`** Key. #### Toggle Full screen[​](#toggle-full-screen "Direct link to Toggle Full screen") To toggle Space between fullscreen and windowed mode press **F11** Key(Windows), Command(Γ’Ε’Λœ) + F(Mac OS). #### Toggle UI[​](#toggle-ui "Direct link to Toggle UI") Press the F9 key or Alt+U to toggle the user interface on/off. #### Additional Short Cut Keys[​](#additional-short-cut-keys "Direct link to Additional Short Cut Keys") F1: Help Ctrl+T: Toggle Chat Ctrl+F: Toggle Friends Ctrl+E: Toggle Explore Ctrl+H: Go Home Ctrl+Q: Toggle Quests (nb: this shortcut may change) Ctrl+I: Toggle Inventory Ctrl+O: Toggle Outfit Ctrl+S: Toggle Shop Ctrl+U: Toggle Auction Ctrl+\`: Toggle Snapshot Mode Ctrl+/: Toggle Settings Alt+Left/Right Arrow: Move Chat Tab F12: Show avatar profile Ctrl+M: Toggle Mail Ctrl+Space: Start a search --- ### Outfits #### Overview[​](#overview "Direct link to Overview") The Outfit window is where you can create new outfits, edit an outfit or delete an outfit. The Outfit window is where you can create new outfits, edit an outfit or delete an outfit. You can open the Outfit window by clicking on the Outfit button at the bottom of the screen. info When you sign up, you can choose a default avatar; don't worry, you can customise or make a new one when you log in! ##### Creating new outfits[​](#creating-new-outfits "Direct link to Creating new outfits") To create a new outfit, first go into the Outfit window by clicking on Outfit at the bottom of the screen, then at the top of the Outfit window, click on Create New Male or Female. ![](/assets/images/createnew-22c1697ed114cf5002444cf36fb1e458.jpg) When you click on one of these, a pop up will appear asking you to name the outfit. Once you have named it, click on OK to create the outfit. This will give you a default avatar which is customisble. You can see which outfit is active by opening the Outfit List (the active outfit will be in grey). ![](/assets/images/selectedooutfit-963c61f75cb7a8a45eb661cfc60cfdc9.jpg) The Copy ID button can be ignored; this is generally used for developers who want to use their live outfits to make NPCs. ##### Outfit Options[​](#outfit-options "Direct link to Outfit Options") Other than creating new outfits, there are a few more options along the top of the Outfit window. ![](/assets/images/Outfitwindowops-82065200cf45a8b6c613b4af57a11b7e.jpg) * **Save As -** You can have any outfit active, and after customising it, you can then choose to Save As to save it as a separate outfit with a different name. * **Delete -** This will delete the current active outfit. Only click this if you are really sure you want to delete the outfit, as you won't be able to restore it. * **Outfit List -** This is where you can see a full list of all the outfits you have made. * **Refresh List -** If you make a new outfit and it doesn't show up on the list, you can click on refresh to refresh the list and it should show the new outfit listed. ##### Customising an outfit[​](#customising-an-outfit "Direct link to Customising an outfit") There are a lot of customise options for avatars in the Outfit window; You can change what clothing your avatar is wearing, choose a preset, customise the head and body, change the skin or use morphs. You can find all these options down the left-hand side of the Outfit window. ![Customise Options are on the left-hand side](/assets/images/customoptions-97f4ab2dfd9179f4ac534875814e4c0d.jpg) --- ### Outfit IDs #### Overview[​](#overview "Direct link to Overview") If you want to set up NPCs to show off your clothing brand in Sinespace, find the Outfit ID and attach it to an NPC statue. If you want to set up NPCs to show off your clothing brand in Sinespace, find the Outfit ID and attach it to an [NPC statue](/sinespace-sdk/components/statue.md). The outfit ID is the number at the end of the outfit name in the Outfit window – ![](/assets/images/700px-outfitid1-73fb88c9ee8eeb512a054b73be3fde74.png) Note the outfit ID number down for the outfit you want on your NPC. In Unity, add this to the Player Outfit ID box on the NPC statue component, then upload the NPC like you normally would. ![](/assets/images/700px-npcstatav-c67246f1e0d7975406b7f25f85f85527.png) --- ### Regions #### [πŸ“„οΈRegions In Sinespace](/sinespace-viewer/regions/regions-in-sinespace.md) [Learn what Sinespace regions can provide, from free home regions and private access controls to custom Unity-built spaces.](/sinespace-viewer/regions/regions-in-sinespace.md) --- ### Regions In Sinespace #### Overview[​](#overview "Direct link to Overview") Your first home region is completely free with 128MB of space. Regions can be public, private, customised, and built for larger events or collaborative work. ##### First region free[​](#first-region-free "Direct link to First region free") ![FirstRegion.png](/assets/images/firstregion-ae8a57cf587d6054c045e474097a46dc.png)
Your first home region is completely free with 128MB of space. Click on the Home button in-world! You can add more regions with region subscriptions. * [Region Subscriptions](https://sine.space/user/subscription) ##### Build vast open worlds[​](#build-vast-open-worlds "Direct link to Build vast open worlds") ![Limitations2.png](/assets/images/limitations2-b7b5dfbbaa353595bb8d3b251666d2a3.png)
No geographical limitations means you can create a large exterior region or a small interior, the choice is up to you. ##### Private and public spaces[​](#private-and-public-spaces "Direct link to Private and public spaces") ![PrivateSpace.png](/assets/images/privatespace-afceed968ae1710c966ea9bfb26f5f6f.png)
With region management, you can control who has access to your region. You can also have a completely private version of Sinespace on a white label grid for added privacy. * [Region Management](/sinespace-sdk/regions/management.md) ##### Customisable regions[​](#customisable-regions "Direct link to Customisable regions") ![Region customisation.png](/assets/images/region-customisation-3d1d1ff68263dfabb0ecdd1a9018d411.png)
Regions are fully customisable thanks to our in-world Inspector. The in-world inspector lets you change almost everything in the region, including light colors, textures and the shape and layout of buildings. * [Uploading Items as Furniture](/sinespace-sdk/furniture/how-to-upload-items-as-furniture.md) * [Adding Poses to Furniture](/sinespace-sdk/furniture/adding-poses-to-furniture.md) ##### Build regions of AAA standards[​](#build-regions-of-aaa-standards "Direct link to Build regions of AAA standards")
With Unity as our game engine, and access to environmental scripts in our editor pack, creators are able to make beautiful and realistic regions built to AAA game standards. * [Regions Overview](/sinespace-sdk/regions.md) * [Region Set-up](/sinespace-sdk/avatars/gestures/set-up.md) * [Region Upload Settings](/sinespace-sdk/regions/upload-settings.md) * [Region Export Settings](/sinespace-sdk/regions/export-settings.md) * [Platform Settings](/sinespace-sdk/regions/platform-settings.md) * [Region Submission](/sinespace-sdk/regions/submission.md) * [Region Lighting](/sinespace-sdk/regions/lighting.md) * [Navigation Bake](/sinespace-sdk/regions/navigation-bake.md) * [Occlusion Bake](/sinespace-sdk/regions/occlusion-bake.md) * [Post Processing](/sinespace-sdk/regions/post-fx.md) ##### Collaborate and build together[​](#collaborate-and-build-together "Direct link to Collaborate and build together") ![Collabbuild.png](/assets/images/collabbuild-1d90584abfe15963d0b00ea4f46ff861.png)
The 'Edit Room' system allows you to collaborate with other creators to design a perfect region! ##### Scale easily[​](#scale-easily "Direct link to Scale easily") ![LargeEvent.png](/assets/images/largeevent-2e63673d621b977ee9626e353af09215.png)
You can hold a large event due to being able to shard regions. Also, depending on subscription level, you can have up to 100 avatars in one region. * [Region Subscriptions](https://sine.space/user/subscription) If you need any guidance on how to upload your creations to Sinespace or want to chat with other creators, check out our [Discord Channel!](https://discord.gg/sinespace) --- ### Your Regions #### Overview[​](#overview "Direct link to Overview") Click the Home button at the bottom of the client to teleport to your own private space, or to see the list of regions you own if you are a subscriber with multiple regions. #### Access your Regions[​](#access-your-regions "Direct link to Access your Regions") Click the Home button at the bottom of the client to teleport to your own private space, or to see the list of regions you own if you are a subscriber with multiple regions. You can teleport to any of your regions from here. ![Regionslist.png](/assets/images/regionslist-e0b422030c3bded262f03b80167d4f94.png) #### Region Slot Management[​](#region-slot-management "Direct link to Region Slot Management") If you have uploaded more regions than you have available slots for you can swap around which are enabled and which are disabled. #### Region Management[​](#region-management "Direct link to Region Management") Click EDIT in the INFO tab of the REGION MANAGEMENT window (which you can open from the minimap in a region, or from the room list if you want to change settings of a region you own but are not currently standing in.) 1. Open the Region Management window ![Roominfo1.png](/assets/images/roominfo1-a9f642d1cc796a9927f977fe9f4d00f5.png) 2. Click on Edit to change settings for this region. ![Editinforoom.png](/assets/images/editinforoom-39903e659e1341540b94fc4f07c2a53d.png) #### Room Access[​](#room-access "Direct link to Room Access") Your room will be set to public; open to anyone; by default. You can set it to friends only, or approved only. ![Roomaccess1.png](/assets/images/roomaccess1-3933e0daef95924d0b396924961233e4.png) Room access permissions are tied to each region; you can have lots of different regions with different public and private access groups. To approve specific people to access an approved only region, invite them to teleport in; they will be prompted to request access and you can grant it. They will then appear as a member in the MEMBERS tab of the REGION MANAGEMENT window. They can attempt to teleport in, prompting the access request, by finding your region in the EXPLORE panel, or via your profile. They can use the region url. Or you can offer a teleport direct to you via the TELEPORT button on their PROFILE window. #### Members[​](#members "Direct link to Members") If your region is set to friends only or approved only you will see a list of everyone with access in the MEMBERS tab of the REGION MANAGEMENT window. ![Roommembers.png](/assets/images/roommembers-a904846b6361726f046bcc40d1334a67.png) You can modify this, barring, removing or giving admin permissions on an individual basis. #### Spawn Rules[​](#spawn-rules "Direct link to Spawn Rules") Spawnable items, including all generic virtual goods, can be deployed on a timed basis in a region. ![Spawningpolicy.png](/assets/images/spawningpolicy-aee29f99028e42ccb2db90d5cdcd1eed.png) You can set each of your regions to no spawned items (default) or you can allow only admin (including yourself) to spawn items. Or you can let anyone who has access to the region spawn items and limit their duration. Spawned items will also disappear automatically when the owner logs out of the region. #### VOIP Rules[​](#voip-rules "Direct link to VOIP Rules") Here you can change the settings for VOIP (voice chat) in your region. You can set it so it is disabled, so it's only enabled for the owner or so it's enabled for everyone. ![VOIPrules.png](/assets/images/voiprules-6ed225da60b3ce310fefbb359654c733.png) #### Multiple Regions[​](#multiple-regions "Direct link to Multiple Regions") Everyone in Space automatically gets one free region. If you want to upload your own unique region content to your region, go to curator.sine.space and sign up as a creator, for free, and follow the tutorials on how to create your own region content. If you want to own multiple regions in Sinespace, please see our [Subscriptions](https://sine.space/user/subscription) page for more information. --- ### Settings #### Overview[​](#overview "Direct link to Overview") There are quite a few settings you can change on the viewer; You can change Graphics, UI, Controls, Sound, Misc and VR. There are quite a few settings you can change on the viewer; You can change Graphics, UI, Controls, Sound, Misc and VR. You can access the Settings from the Settings button on the login screen or from in-world via the Settings icon in the bottom right. ##### Graphics[​](#graphics "Direct link to Graphics") Under the Graphics settings you can choose from our graphics presets; Fastest, Fast, Medium or Quality. These are fast ways to adjust the overall graphics quality to suit your system. ![An overview of the Graphics settings](/assets/images/Graphicssettings-d5b72e08f14d8daa1e9daf8deaa66532.png) We have also included Advanced Options, so you can adjust certain graphical components individually, such as Bloom, Depth of Field and Quality lighting. Disabling these can improve your framerate but at the cost of visual quality. ##### UI[​](#ui "Direct link to UI") The UI settings allow you to change the size of the interface. You will need to restart the viewer for the scaling to take effect. ![](/assets/images/uisettings-6da3862b07f36ae6e39fd6648b11d106.png) info If you get stuck while resizing the interface, hold the left shift key at viewer startup to revert to default scale! ##### Controls[​](#controls "Direct link to Controls") The control settings allow you to change certain control aspects like 'Click to walk' or 'Use Gamepad'. ![](/assets/images/controlsettings-233683864d0e5a2ffc8377396e5dff49.png) You can also change the mouse sensitivity with the slider to change the look speed in-world. ##### Sound[​](#sound "Direct link to Sound") Here you can change the volume for music, sound effects, voice volume and also change default devices like microphone, playback and webcam as well as the mic sensitivity. ![](/assets/images/audiosettings-c1bbdd32e402348aa692cc47b5712692.png) ##### Misc[​](#misc "Direct link to Misc") Here you can clear cache, change the cache location and disable/enabled other options. ![](/assets/images/miscsettings-a43d43526a798cac39b4b351a6e9adb8.png) You can also change the framerate and toggle vSync on/off from here. ##### VR[​](#vr "Direct link to VR") This is where you can enable VR, choose your preferred VR device, choose your dominant VR hand and change other options for VR. ![](/assets/images/vrsettings-aa74957d2ac8eae83cd4827d4d0fd7e8.png) warning Enabling or changing the VR device will require a viewer restart --- ### Shop #### Overview[​](#overview "Direct link to Overview") Click the Shop button in the bottom menu to search or browse the entire inventory of virtual goods in Space. #### Shop[​](#shop "Direct link to Shop") Click the Shop button in the bottom menu to search or browse the entire inventory of virtual goods in Space. ![Inworld Shop Window.png](/assets/images/inworld-shop-window-1c032c5b51d56f5f038c79636661534c.png) You are able preview clothing, full avatars in addition to attachments prior to purchasing. ![Preview Clothing.png](/assets/images/preview-clothing-dbc1b371cb9038d57db3461164d1ca5d.png) *** --- ### Viewer Basics #### Overview[​](#overview "Direct link to Overview") System Requirements Please see our system requirements for desktop and VR here. ##### System Requirements[​](#system-requirements "Direct link to System Requirements") Please see our system requirements for desktop and VR [here](/quickstart-sinespace-viewer/get-started-viewer/system-requirements.md). ##### Settings[​](#settings "Direct link to Settings") To see all of our setting options see [Settings](/sinespace-viewer/settings.md). ##### UI[​](#ui "Direct link to UI") Here is an overview of our UI: (image) To edit your profile, change to full-screen or exit the viewer, click on the three lines in the top right of the viewer. For more info on each UI tab along the bottom of the screen, please see the following: Home [outfits](/sinespace-viewer/outfits.md) Socialising [Shopping](/sinespace-viewer/shop.md) ##### Moving Around[​](#moving-around "Direct link to Moving Around") To move your avatar around, you will need to use these keys: * W = Walk forward * A= Walk Left * S= Walk backward * D= Walk right You can fly using R to start flying and to fly higher, and use C to land, or use Pg Up and Pg Down and WASD to change direction. You can also enable the option to 'Click to Walk' under Settings. ##### Shortcut Keys[​](#shortcut-keys "Direct link to Shortcut Keys") * F1: Help * F9: Toggle UI * Ctrl+T: Toggle Chat * Ctrl+F: Toggle Friends * Ctrl+E: Toggle Explore * Ctrl+H: Go Home * Ctrl+Q: Toggle Quests (This shortcut may change) * Ctrl+I: Toggle Inventory * Ctrl+O: Toggle Outfit * Ctrl+S: Toggle Shop * Ctrl+U: Toggle Auction * Ctrl+\`: Toggle Snapshot Mode * Ctrl+/: Toggle Settings * Alt+Left/Right Arrow: Move Chat Tab * F11: Toggle fullscreen * F12: Show avatar profile * Ctrl+M: Toggle Mail * Ctrl+Space: Start a search --- ### XMPP Chat Client #### Overview[​](#overview "Direct link to Overview") One of spaces' new features is the ability to use XMPP clients in conjunction with the normal space chat. One of spaces' new features is the ability to use XMPP clients in conjunction with the normal space chat. You can use XMPP clients to chat to other users through the in world space chat window, and they can reply back either using a XMPP client or using the normal space chat. #### XMPP Clients[​](#xmpp-clients "Direct link to XMPP Clients") Any XMPP client is fine to use, but for this walkthrough, I'm using Pidgin. Download and install the client you want to use, and then follow the next steps to get it set up for use with space. #### XMPP Client ID[​](#xmpp-client-id "Direct link to XMPP Client ID") To use the xmpp client, you will need a specific ID which is linked to your space account. To find this ID, you will need to go to [sine.space](http://sine.space/) and log in using your details. After you have logged in, click on 'Account' at the top of the page. On this page, you will see your information, and also see the XMPP client ID. Make sure to note this ID somewhere. #### Using your ID in the XMPP Client[​](#using-your-id-in-the-xmpp-client "Direct link to Using your ID in the XMPP Client") Open your XMPP client, and you will see something similar to this. You will need to change a couple of settings and add your ID. Here I have changed the settings to the right ones and added in my xmpp ID. Click on 'Add' and your xmpp account will be set up! --- ## Support ### Support #### [πŸ“„οΈBug Reporting](/support/bug-reporting.md) [Bug Reporting If you have found a bug on our viewer and want to report it, you will need to report it to us through our issue tracker.](/support/bug-reporting.md) --- ### Bug Reporting #### Overview[​](#overview "Direct link to Overview") If you have found a bug on our viewer and want to report it, you will need to report it to us through our issue tracker. If you have found a bug on our viewer and want to report it, you will need to report it to us through our [issue tracker](https://issues.sine.space/login_page.php). You will need to login with your Sinespace username and password before you can report an issue. ##### **Issue tracker interface – How to report**[​](#issue-tracker-interface--how-to-report "Direct link to issue-tracker-interface--how-to-report") When you have logged in, you can either click on the Report Issue button in the top right corner of the screen, or on the left-hand side. When you have clicked on that button, you will see a Enter Issues Details screen with the following: * **Category**: The category is a necessary field to fill in. The category is which OS you are using our viewer on. * **Reproducible**: This is optional to fill in, but it does help us test for the bug quicker. * **Severity**: This is optional, but if the severity is marked, it will help us prioritize bugs which are more important to fix such as major, crashing or blocking bugs. * **Select Profile**: The profile is the version of OS you are using such as 32 or 64-bit Windows. You do not need to fill this in if you do not know the information. * **Product Version**: This is the internal product release number, if you do not know this then it is fine to leave this blank. * **Summary**: This is a necessary field to fill in; it is the general heading for the issue, such as β€˜Live viewer crashing’ * **Description**: This is a necessary field to fill in; you will need to add a description of the bug here. The more information you add in the description allows us to find and fix the bug quicker. * **Additional Information**: This is for any additional information you might add which could be useful in fixing the bug. * **Tags**: You can add your own tag here, but it is recommended to use the tags under Existing tags to help us find your report. * **Upload files**: You can use this to upload your logs or crash reports, or upload images of the bug if possible. * **View Status**: This is to change the viewing status of the bug to private or public. We recommend setting this to public so our engineering team can see your report as soon as it is posted. * **Report Stay**: Please check this if you need to make more reports. When you have filled in all the relevant information, you can then click on the Submit Issue button to submit it to us. If you click on the My View button on the left-hand side, you will be able to see all of the bug reports you have made and see their status; they will have a green colored box if the issue has been resolved. ##### **Steps to reproducing issues**[​](#steps-to-reproducing-issues "Direct link to steps-to-reproducing-issues") The Sinespace Development team need as much detail as possible to recreate issues, be concise and give step by step details of how the issue can be reproduced. Please make sure that bug reports include the following: * The viewer/editor pack version being used. * Is it the Windows or Mac version? * Tell us what happened, be as detailed as possible include screenshots, output logs or console errors where necessary. * Tell us how to recreate the issue, be as detailed as possible with step by step instructions. An example for this is: * You change your Outfit in the Outfit window, and when you save and close, your avatar is stuck in T-pose. * You try to fix it by changing your Outfit and saving again, but it does not fix. * You try to move your avatar around, but the animation is still stuck in T-pose. These are the steps we would follow to reproduce the bug and see what is causing the issue. ##### **Retrieving viewer output logs**[​](#retrieving-viewer-output-logs "Direct link to retrieving-viewer-output-logs") If support asks you to recover a log file for us - usually if something has gone wrong, and we need more information. The following steps will allow you to return it to us. **Windows** For Windows, log files are located in the "Application Data" folder, to open this - hold down the Windows Key on your keyboard, and press the 'R' key (you can also use "Run..." from the Start Menu) Paste the following text: **%appdata%\\..\LocalLow\Sine Wave Entertainment Ltd\sinespace** And press enter, this will open a Windows Explorer window - look for a file named **output\_log** - this is the log file, please return this via email to us or through Support. **MacOS** For macOS, log files are in the user Library folder - to access this, open Finder, and press **Shift** **⌘+G** to open the "Go to Folder" option - in the textbox, enter: **~Library/Logs/Unity** You are looking for a file named Player.log - this is the log file, please return this via email to us or through Support. **Linux** For Linux, the file you are looking for is: **~/.config/unity3d/Sine Wave Entertainment Ltd/sinespace/Player.log** Please return to us via email or through Support. --- ### FAQ #### Overview[​](#overview "Direct link to Overview") Navigation How do I move around? **Walking:** You can walk around the virtual world by using the arrow keys on your keyboard. ##### Navigation[​](#navigation "Direct link to Navigation") ###### How do I move around?[​](#how-do-i-move-around "Direct link to How do I move around?") **Walking:** You can walk around the virtual world by using the arrow keys on your keyboard. If you're familiar with playing video games on a computer, you can also make use of the inverted-T cluster, or WASD keys.
**Running:** To run, simply hold down the Shift key while walking.
**Jumping:** To jump, press the space bar.
**Optional mouse control:** You can also move around by left-clicking at a spot on the ground. Your avatar will then walk to the specified point and stop. This is called the "click to walk" setting, and you can turn it off in the Settings menu if you like. ###### Can I fly?[​](#can-i-fly "Direct link to Can I fly?") Yes. To start flying, first press the F key. This will lift your avatar into the air, where you'll hover. You can then use the arrow keys or WASD keys to soar about. Press the E key (or Pg Up) to fly higher, and the C key (or Pg Down) to fly lower. Press the F key again to land. ###### How can I change my camera angle?[​](#how-can-i-change-my-camera-angle "Direct link to How can I change my camera angle?") You can change your camera angle by holding the right mouse button down as you move your mouse. If you want to focus on a certain point, hold down the Alt key and click the right mouse button, then use your mouse scroll wheel to zoom in and out. Pressing the F4 key on your keyboard will turn on Fly Cam, which is another useful way to explore your surroundings. Once enabled, use the A and D keys to pan from side, and the W and S keys to zoom in and out. If you want to rotate the camera in Fly Cam mode, hold down the right mouse button and move the mouse. ###### Do I need a mouse to use Sinespace?[​](#do-i-need-a-mouse-to-use-sinespace "Direct link to Do I need a mouse to use Sinespace?") Yes, you will need a mouse or a touchpad. ###### How can I visit different places?[​](#how-can-i-visit-different-places "Direct link to How can I visit different places?") Each region contains different locations that you can visit. You can travel to the locations within a region by clicking on the "Explore" button at the bottom of your screen, and then clicking on one of the landmarks. If you want to travel to a completely different region, click on the "World Map" button. This will call up a list of places you can visit. Mouse over them, and click on the "Enter" button when you've found one you want to see. Once you've successfully traveled to the new region, you can use the Explore function detailed above to learn more about the locations within it.
##### Vehicles[​](#vehicles "Direct link to Vehicles") ###### How can I get a vehicle?[​](#how-can-i-get-a-vehicle "Direct link to How can I get a vehicle?") You can buy vehicles from the [Sinespace Shop](https://sine.space/shop/category/26/0/Vehicle/). When logged in to the platform itself, click on the "Shop" button located at the bottom of your screen. Once the Shop is open, click on the tab marked "Vehicles." You can purchase a vehicle by clicking on the "Buy" button located under the vehicle picture. Vehicles can be purchased with either Silver or Gold. ###### How do I drive my vehicle around?[​](#how-do-i-drive-my-vehicle-around "Direct link to How do I drive my vehicle around?") To drive a vehicle, first click on the "Inventory" button located at the bottom of your screen. Scroll through your inventory items, and then click on the vehicle you want to use. When the "Drive" button appears, click on it, and the vehicle will spawn in your current region. Once the vehicle appears, click on it and you will automatically be placed in the driver's seat. To turn and accelerate, use the arrow or WASD keys. Use the space bar to brake. To get out of the vehicle, just click on it again. The vehicle will automatically despawn once you have exited it.
##### Outfits and Clothing[​](#outfits-and-clothing "Direct link to Outfits and Clothing") ###### How can I change my outfit?[​](#how-can-i-change-my-outfit "Direct link to How can I change my outfit?") To change your avatar's outfit, click on the "Outfit" button at the bottom of your screen. This will open the Outfit window. To see all of the clothes and accessories you currently own, click on the individual "Wardrobe" buttons or on the "Inventory" button. To change your clothing, click on the item you want to wear and it will be placed on your avatar. We do have a layering system in place, so you can wear multiple items of clothing at one time. Once you have chosen all the items you want to wear, click on the "Save and Close" button to save your avatar and return to the region. ###### How can I purchase more clothes?[​](#how-can-i-purchase-more-clothes "Direct link to How can I purchase more clothes?") To purchase additional clothes and accessories, click on the "Shop" button at the bottom of your screen. Once inside the Shop, click on the "Clothes" tab located at the top of the menu. You can browse our collection of clothes and accessories by using the search function or by clicking on the category tabs on the right. When you find an item you like, you can preview it by clicking on the item picture or the "Preview" button. Clicking on the "Buy" button will complete your purchase. Clothing and accessories can be purchased with either Silver or Gold. ###### How can I make a new outfit?[​](#how-can-i-make-a-new-outfit "Direct link to How can I make a new outfit?") Our Outfit system allows you to create new avatar looks and save them for future use. To make a new outfit, click on the "Outfit" button. Once the Outfit window has opened, you will see a button on the left-hand side labeled "New Outfit." Click on this button, and two boxes will appear -- one that says "Enter a Name" and another saying "Base Male." Enter the name of the outfit (for example, "Business Casual Dress,") and then use the dropdown menu next to Base Male to specify whether this outfit is intended for a "Base Male" avatar or a "Base Female." Once you have done of these things, click the button that says "Create." You can then choose your avatar's hair, skin, clothing, and accessories. When you're finished designing your avatar, click the button labeled "Save and Close" to keep this outfit saved for whenever you want to use it. You can also use the dropdown menu at the top to see all the outfits you have made, and use the "Switch" button to switch to another saved outfit.
##### Friends and Communication[​](#friends-and-communication "Direct link to Friends and Communication") ###### How can I add users as friends?[​](#how-can-i-add-users-as-friends "Direct link to How can I add users as friends?") To add another user as a friend, click on their avatar and then click on the "More" button that appears on the right side of the screen. When the other user's full profile pops up, click on the "Add Friend" button in their profile. ###### How can I invite friends to my location?[​](#how-can-i-invite-friends-to-my-location "Direct link to How can I invite friends to my location?") You can invite a friend to join you in your current location by clicking on β€œFriends" button at the bottom of your screen, and then clicking on your friend's name. This will open a private chat window. Now click on the β€œTeleport” button located within this private chat window. Once your friend accepts your invitation, they will teleport straight to you. ###### How can I remove people from my friends list?[​](#how-can-i-remove-people-from-my-friends-list "Direct link to How can I remove people from my friends list?") To remove someone from your friends list, click on the "Friends" button at the bottom of your screen. Find the person you wish to remove, and click on their name. This will open up a private chat window. Now click on the "Remove Friend" button located within this private chat window. ###### How can I talk to other people?[​](#how-can-i-talk-to-other-people "Direct link to How can I talk to other people?") You can talk to other in-world users via public text chat, or by sending private text messages. To talk to other users in public chat, click on the chat window at the bottom of your screen and type out your message. Once you're finished, you can hit the Enter key on your keyboard or click the "Send" button in the chat window. To send a private chat message, click on a nearby user. A private chat window will open, where you can type your message and send it by hitting the Enter key on your keyboard or by clicking the "Send" button. If you've added friends to your Friends list, you can talk to them at any time by clicking on the "Friends" button and then clicking on their name. You can also talk to other people currently in the same region as you by using region chat. The region chat will always display the name of the region, such as *Welcome Center*, so you can easily identify it. ###### Can I voice chat with other users?[​](#can-i-voice-chat-with-other-users "Direct link to Can I voice chat with other users?") We have Vivox integrated into Sinespace. If a region creator has added Vivox zones, that means you can voice chat with other users in those zones. To activate this service, click on the "Voice Chat" button located at the bottom of your screen. Hold down the right Alt key while you're speaking, and let go of the right Alt key when you want to mute. ###### Can I e-mail other users within Sinespace?[​](#can-i-e-mail-other-users-within-sinespace "Direct link to Can I e-mail other users within Sinespace?") Yes, you can e-mail other users in Sinespace by using our in-world e-mail feature. To e-mail a user, click on their avatar and then click on the "More" button that appears on the right side of the screen. Once their user profile is open, click the "E-mail" button to send them an e-mail. You can also send virtual items via Sinespace e-mail by clicking "Add an attachment."
##### Performance Related[​](#performance-related "Direct link to Performance Related") ###### My PC is lagging when I run Sinespace. What can I do?[​](#my-pc-is-lagging-when-i-run-sinespace-what-can-i-do "Direct link to My PC is lagging when I run Sinespace. What can I do?") Your best option is to adjust the graphics settings. For an easy fix, click the "Settings" button located in the bottom right corner of the screen, and drag the "Visual Boost" slider to its lowest setting. ###### How can I improve the visual quality of Sinespace?[​](#how-can-i-improve-the-visual-quality-of-sinespace "Direct link to How can I improve the visual quality of Sinespace?") You can increase the graphics settings to make the platform run faster. To do so, click the "Settings" button located in the bottom right corner of the screen, and drag the "Visual Boost" slider up. We also have Quick Settings designed to accommodate older PCs, mid-range PCs, high end PCs, and Gaming PCs. Choosing one of these will automatically lower or raise the Visual Boost slider to the appropriate level for your equipment. These settings will also enable or disable Post FX settings for our regions. If you want to manually control the Post FX settings, you can do so with the Advanced Settings menu. ###### Can I run Sinespace on an Ipad, Android, or my phone?[​](#can-i-run-sinespace-on-an-ipad-android-or-my-phone "Direct link to Can I run Sinespace on an Ipad, Android, or my phone?") Right now Sinespace is only accessible with a PC that is running Windows, MacOS, or Linux. We have Android and iOS clients in the works, and you can access experimental versions on request. We are planning to release Sinespace across a range of devices in the future. ###### Why is there a button saying "Offline Mode?"[​](#why-is-there-a-button-saying-offline-mode "Direct link to Why is there a button saying \"Offline Mode?\"") This usually means either that your internet is disconnected or you're currently behind a firewall that is preventing Sinespace from accessing the internet. You can still continue to play, but you won’t be able to see other users. ###### My character is stuck and I can’t move! What should I do?[​](#my-character-is-stuck-and-i-cant-move-what-should-i-do "Direct link to My character is stuck and I can’t move! What should I do?") There may be a couple of pesky bugs that cause your avatar to become stuck in a region. If you refresh the page, you'll unstick yourself and arrive back at your current region's default location. You can help us resolve this issue by sharing details of what happened. You can file a report with us by clicking the "Request Support" button under Help. ###### I found a bug. How can I report it?[​](#i-found-a-bug-how-can-i-report-it "Direct link to I found a bug. How can I report it?") If you find a bug, please click on the "Help" button located at the bottom of the Sinespace client, and then click on "Request Support." It will be helpful if you entitle the message "Bug Report," and then provide as many details as possible about what happened. This message will be sent to our support team for review. You can also submit a bug report on our [forums](https://forum.sine.space/) on the Bug Report thread, or report the bug using Sine Wave's Freshdesk. You will have to create a new support ticket, and then fill in all of the details. ###### How can I see upcoming patches or news?[​](#how-can-i-see-upcoming-patches-or-news "Direct link to How can I see upcoming patches or news?") To see upcoming changes or news, visit our [blog](https://blog.sine.space/). To speak with fellow community members or learn more about our experimental features, visit our [forums](https://forum.sine.space/).
##### Currency[​](#currency "Direct link to Currency") ###### What are Silver and Gold, and how can I use them?[​](#what-are-silver-and-gold-and-how-can-i-use-them "Direct link to What are Silver and Gold, and how can I use them?") Silver is the currency of the platform. You can use it to purchase items from our [in-world Shop](https://sine.space/shop), and to participate in activities. Gold is an alternative to Silver, which can be purchased with real life currency. Some items in the Shop can only be purchased with Gold. ###### How can I earn Silver?[​](#how-can-i-earn-silver "Direct link to How can I earn Silver?") You can earn Silver by doing various activities and quests. ###### ##### Activities and Quests[​](#activities-and-quests "Direct link to Activities and Quests") ###### How do I do an activity or quest?[​](#how-do-i-do-an-activity-or-quest "Direct link to How do I do an activity or quest?") Activities and quests are marked by an exclamation point icon on the map. To travel to an activity, click on the β€œExplore” button located at the bottom of your screen, and then click on the activity or quest name on the map. This will teleport you to the activity or quest. Now click on the item or avatar with the exclamation point hovering overhead, and the quest will begin. ###### How can I take a snapshot?[​](#how-can-i-take-a-snapshot "Direct link to How can I take a snapshot?") Our built-in Snapshot tool lets you take amazing snapshots and selfies. To get started, click on the "Snapshot" button at the bottom of your screen. This will open the tool, and present you with several options. You can add a filter, make your avatar strike a pose, change the camera angle, or add an overlay. You also have the option to capture the scene you want to photograph as a GIF, or to create a 360Β° image. Once you've chosen the settings you want, click the button labeled "Take Photo." If you're not a fan of the picture you just took, you can click the "Retake Pic" button to try again. If you're happy with it, hit "Save and Upload." You can then name your image, add a description, and save it to your Sinespace album or your computer. You can also check the "E-mail" option if you'd like to e-mail a copy to someone in Sinespace, or make the image your profile pic by clicking on "Make Profile Pic."
##### Account Related[​](#account-related "Direct link to Account Related") ###### I forgot my password. How can I reset it?[​](#i-forgot-my-password-how-can-i-reset-it "Direct link to I forgot my password. How can I reset it?") To reset your password, click on the "Sign In" button on [our website](https://sine.space/) then click on "Reset Your Password." We will send an e-mail to your registered e-mail address with a link to reset your password.
###### I forgot my username, how do I recover it?[​](#i-forgot-my-username-how-do-i-recover-it "Direct link to I forgot my username, how do I recover it?") If you have forgotten your username, you can find it on your account settings page.
###### How do I change my password?[​](#how-do-i-change-my-password "Direct link to How do I change my password?") You can change your password by logging in and going to your account settings page. Once you're there, type your current password and new password into the appropriate boxes and click "Update."
###### How do I update my e-mail address?[​](#how-do-i-update-my-e-mail-address "Direct link to How do I update my e-mail address?") You can change your e-mail address by [creating a support ticket](#).
###### Is Sinespace free to use?[​](#is-sinespace-free-to-use "Direct link to Is Sinespace free to use?") Yes, Sinespace is completely free to play. Every user gets a free region, which you can access by clicking on the "Home" button. If you require more regions, you will have to purchase land.
##### Home Regions[​](#home-regions "Direct link to Home Regions") ###### What is a home region?[​](#what-is-a-home-region "Direct link to What is a home region?") Your home region is your own personal area in Sinespace. You can decorate your region, invite friends to visit you, and and even hold parties! Your home region is ready and waiting for you as soon as you sign in to Sinespace -- just click on the "Home" button at the bottom of your screen to teleport to it. You can add additional areas by clicking on the "Home" tab and then clicking "Create New Room." ###### How do I travel to my rooms?[​](#how-do-i-travel-to-my-rooms "Direct link to How do I travel to my rooms?") Click on the "Home" button at the bottom of your screen. You can teleport to any of the rooms you've created from here, and you can also disable and enable rooms. ###### How can I purchase furniture for my home?[​](#how-can-i-purchase-furniture-for-my-home "Direct link to How can I purchase furniture for my home?") Click on the Shop button at the bottom of your screen. When the Shop opens, click on the "Furniture" tab. This will allow you to browse through our catalog of furniture items and decor. When you find something you like, you can purchase it using the "Buy" button. ###### How do I place furniture in my home?[​](#how-do-i-place-furniture-in-my-home "Direct link to How do I place furniture in my home?") To place furniture in your room, you will need to click on the "Edit Room" button while standing in the room you want to decorate. Once you do, you'll see an Inventory manager appear at the bottom of your screen. Click on any item in the inventory, it will be spawned into the room. Once it is spawned, you can move it around with the tools located at the top of the screen. info If you hold the Alt key as you make your selection, the furniture will be placed on the closest surface below your cursor. If you do not have the Alt key pressed, the furniture will be placed on the floor. If you hold down Shift while placing, your furniture, it will temporarily deactivate the Snap and Align modes. ###### How do I decorate my home?[​](#how-do-i-decorate-my-home "Direct link to How do I decorate my home?") While standing in the room you want to decorate, click on the "Edit Room" button. This will bring up a suite of tools that you can use to decorate your room. ###### How do I buy a room design?[​](#how-do-i-buy-a-room-design "Direct link to How do I buy a room design?") To buy a room design, click on the "Shop" button, and then click on the "Room" tab. You can browse through the available room designs. To buy one, click on the "Buy" button. ###### How can I change the room design of my home?[​](#how-can-i-change-the-room-design-of-my-home "Direct link to How can I change the room design of my home?") First, go to the home with the layout you want to change. When you are there, click on the "Edit Room" button, and then click on the "Design" button at the top of the screen. A pop-up called "Region Templates" will appear on the left side of the screen. Click on the room template you want to use, and then confirm or reject the change. Click on "Swap Template" to change the template. warning When you swap region templates, all of the furniture in your room will be reset. The room will be empty, and you will need to decorate it again. ###### How do I change the light colors in my home?[​](#how-do-i-change-the-light-colors-in-my-home "Direct link to How do I change the light colors in my home?") To change the light colors, click on the "Edit Room" button. At the top of the screen, a button labeled "Lights" will appear. Click it, and when the pop-up opens, you will see a list of all the lights in your home. Use the "Brightness" slider to change the brightness of the lights, or click on one of the available swatches to change the color. You can also pick a custom color by clicking on the "Custom Color" button.
##### Payment Related[​](#payment-related "Direct link to Payment Related") ###### My payment went through, but I haven’t received my Gold yet. What do I do?[​](#my-payment-went-through-but-i-havent-received-my-gold-yet-what-do-i-do "Direct link to My payment went through, but I haven’t received my Gold yet. What do I do?") Please submit a [support ticket](https://support.sine.space/support/home) with your transaction ID. As the subject, put "Payment: \[your transaction ID]." (E.g "Payment: c4545433423.") ###### My credit card isn't working on your website, what can I do?[​](#my-credit-card-isnt-working-on-your-website-what-can-i-do "Direct link to My credit card isn't working on your website, what can I do?") As a first step, please check to make sure you've entered your details correctly. If you still encounter problems making a purchase, please [contact us](https://support.sine.space/support/home) with your account name, and we will get in touch shortly. ###### What payment methods do you accept?[​](#what-payment-methods-do-you-accept "Direct link to What payment methods do you accept?") We support a variety of payment methods, including PayPal, credit card, mobile phone payments and more. ######
[​](#-1 "Direct link to -1") ---