EMUVR TUTORIALS ‐ UGC - umbrella-mod-team/Umbrella-Samples GitHub Wiki

[EMUVR TUTORIALS - UGC]{.underline}

Index

  1. [**[[WIGU Installation and UGC File

    Upload]]{.underline}**](#fot62cbg8a0g)

  2. [**[[Setting Up Tools to Create User Generated Content

    (UGC)]]{.underline}**](#g0hbiq20m09g)

  3. [**[[ Hello World: Create your first UGC, a simple cube

    ]]{.underline}**](#jit3xv68oonc)

  4. Importing a simple model{.underline}

  5. [**[[ Creation of Screens and Televisions

    ]]{.underline}**](#l693kzknbrlc)

  6. Creating systems{.underline}

  7. Systems Animation{.underline}

  8. Custom Media{.underline}

  9. Creating Media / Cartridges{.underline}

---------------------------------------------

1 - []{#fot62cbg8a0g .anchor}[WIGU Installation and UGC File Upload]

Let's start with a quick tutorial for users, where you'll learn how to install and use user-generated content (UGC).

  1. Update to the latest version of EmuVR (1.0.12):

    • Download the latest version of EmuVR from the download channel.

or since [HERE]{.underline}.

  • Update your existing installation with this new version.
  1. Download WIGU:

    • Download the file

      [WIGU_0.12.6.zip]{.underline}.

    • Extract the contents to the EmuVR folder. For example, if your

      installation is in "C:\EmuVR", you should see a new file called "version.dll" in that location.

  2. Important: Temporarily disable WIGU:

    • If you need to disable WIGU temporarily (for example, to

      troubleshoot), simply rename the "version.dll" file to any other name, such as "off_version.dll."

  3. Download an example UGC file:

  4. Ready to use EmuVR:

    • When you run EmuVR, you will see the new item in your inventory,

      under the "UGC Props" tab.

  5. Explora ugc-share:

    • Now that everything is working correctly, you can search for

      more content in the ugc-share community.

  6. Note on UGC downloads for consoles or cartridges:

    • If a UGC file has a note like "Custom Media: something

      something" (for example, "Custom Media: SNES (Network) = 'SNES'" or "Custom Media: PS3"), follow these additional steps:

      • Open (or create) the "custom_media.txt" file in the Game

        Scanner folder.

      • Copy and paste the corresponding part (for example, "SNES

        (Network) = 'SNES'") as a new line into the file and save it.

      • Open Game Scanner and add the new media to scan it.

      • Not all UGC files will need this, so ignore it if nothing is

        mentioned in the shared file. 😉

2 - [Configuring Tools to Create User Generated Content (UGC)]

Installing Unity and the EmuVR UGC Kit

To get started, we need to download and install the same version of Unity that EmuVR uses: Unity 2018.4.12f1. You can find it here: [Descargar Unity 2018.4.12f1]{.underline}

Follow these steps:

  1. Select the right components:

    • During installation, in the "Select Components" section, uncheck

      everything except "Unity 2018.4.12f1".

    • Complete the installation.

  2. Open Unity and create a new project:

    • Abre Unity.

    • Create a new project with the default settings in the location

      you want.

    • You may need to create a Unity account for this.

  3. Download the UGC Kit package:

    • Download the file

      "[UGC_Kit_0.12.unitypackage]{.underline}"

    • Drag and drop the file into the "Assets" folder found in the

      "Project" tab of Unity.

    • You should see two new folders: "My Assets" and "UGC Kit".

  4. Read the important README file:

    • In the "UGC Kit" folder, you will find a crucial README file.

    • Please follow these recommendations:

      • **Do not edit, rename, move or delete anything in this

        folder**.

      • The specific structure of UGC Kit is essential to its

        operation, and any changes may affect your UGC files.

      • Use other folders to add and manage your own assets, such as

        "New Folder", "My Assets" or others that you create outside of the "UGC Kit" directory.

      • Future UGC Kit updates will replace the files in this

        folder, but the rest will not be affected.

  5. If you need to correct the folder structure:

    • Completely delete the "UGC Kit" folder.

    • Then, re-import the "EmuVR UGC Kit.unitypackage" file into your

      project.

      • Don't worry about error messages or "missing script"

        warnings between steps 1 and 2; They should disappear after the reimport, and your assets will be back to normal.

Ready! You are now ready for the "Hello World" tutorial, where you will create and export your first UGC asset for EmuVR: a cube! 🎮🌟

3 - [Hello World: Create your first UGC, a simple cube]

Here we will create a cube, add the "UGC Info" component, save it as a prefab and export it as a UGC file. This will take you directly to your first functional .ugc file, and the more detailed instructions on the tools you will see will be explained later.

First, let's add a new cube to the current scene:

  1. In the Unity toolbar, click "GameObject" → "3D Object" → "Cube".

  2. Select the new cube in the scene and look at the "Inspector" tab on

    the right.

  3. Click "Add Component" and add the "UGC Info" component.

  4. Follow the instructions displayed in the component to add the

    necessary values.

Tip: After clicking "Create prefab asset", you will see a new prefab file called "Cube" in the "UGC Prefabs" folder of the project. The cube in the scene is now simply "linked" to this prefab, but you can still edit it there or directly through the prefab file.

If you open this prefab, you'll see it in the isolated context of an EmuVR room environment with customizable lighting settings (click the small colored icon in the top right corner). This is useful for checking how your materials would look in real game. This is the recommended way to always edit your prefabs.

Click "Change" to select a new "Export Location" folder. Let's choose "C:\EmuVR\Custom\UGC" as per the previous tutorial (this is saved globally, so you only need to do it once).

Then, click "Export UGC" and your first .ugc file will be generated directly in the EmuVR UGC folder. Ready! You can now launch EmuVR and find your new cube in the inventory menu.

Each UGC asset has an ID consisting of the object name and a generated code, such as "Cube_9064e4f5." This is also used as the exported file name, but you can change the file name to whatever you want (although it won't change the internal ID).

You do not need to generate or upload the JSON and PNG files as they are embedded in the .ugc file and are not required for EmuVR or WIGU. However, you could use thumbnails when sharing your UGC with others, for a quick preview.

4 - [Import of a simple model]

In this section, we will perform the same steps as in the cube tutorial, but this time we will import our own 3D model file, add collisions, and set its "forward" direction. Instead of using the old cube, we'll import a 3D model file into your Unity project.

Steps to follow:

  1. Folder organization:

    • Create a new folder inside the "Assets" folder of your project.

      For example: "Assets\My Assets\Imported Models".

  2. Model import:

    • Drag and drop the model file (e.g. .fbx, .obj) from your PC to

      the new folder in the Unity project view.

    • Some models will be automatically imported with embedded

      materials and textures. If this is not the case, you will need to import the associated texture files (.png, .tga, etc.), create a new material and assign it to the object.

  3. Add the model to the scene:

    • Drag the new asset from the project view to the scene view.
  4. Add the "UGC Info" component:

    • Select the object in the scene.

    • Click "Add Component" and add the "UGC Info" component.

    • Follow the instructions as in the previous tutorial.

  5. Add collisions to the object:

    • Check out this page to learn about collisions (just the first

      three topics are enough for now): [Colliders Overview]{.underline}.

    • Avoid mesh colliders whenever possible, as they are slower.

      Instead, it uses "compound colliders" (combination of several primitive colliders such as boxes, spheres and capsules).

    • Roughly adjust the shape of the colliders to fit the object.

      This will improve interaction with other smaller objects and cables.

    • Tip: If you need to rotate a collider, create an empty child

      object ("Empty") and add it there, where you can rotate and even scale it.

  6. Adjust the rotation of the object:

    • Some objects don't rotate as you expect after importing them

      into Unity, and even if you fix their rotations here, they might still look incorrect in EmuVR.

    • When you select your asset, you will see "Up" and "Front"

      arrows, which indicate how it will be rotated in the inventory and when it is grabbed. This setting is defined in the "Selectable" component, where you can edit the "Grab Rotation" value.

    • If you want to use different rotations for Grab versus Inventory

      (for example, light guns and flashlight are displayed sideways in inventory, but will rotate forward when grabbed), enable and edit the Custom UI settings. Rotation" as appropriate (arrows will represent this value while enabled).

    • You can toggle the "Show Gizmo" setting to hide these arrows

      globally.

    • The "Face Camera Y" option will make objects rotate with your

      camera when you look up or down. However, for 99% of objects, it is advisable to keep this option disabled, as it makes it difficult to place them consistently. Some exceptions are items such as weapons, flashlights, knives, and others that must be "pointed forward" when grasped.

  7. Export your UGC and try it in EmuVR!

Tip for scale: Sometimes imported models don't have correct sizes, and it's hard to tell that they're actually too big or too small until you export them and see them in-game. To measure your objects accurately, you can drag the "Measuring Tape" and "Coke For Scale" prefabs from the "Assets/UGC Kit/Helper Prefabs/Misc" folder into your scene. Remember to remove them from your UGC before exporting it.

Here are some pre-assembled examples of UGC prefabs of different types that you can import into your Unity project to learn how they are configured. It is also an example of how to distribute and organize your files and folders. They are ready to be exported as UGC files:

  • Stool (Taburete)

  • LCD TV (LCD TV)

  • Sega Master System

  • Sega Master System Cartridge (Only rough unpolished examples for

    now)

Download: [UGC_Examples.unitypackage]{.underline}

Here are some useful tutorials on how to download and import models, or import them from Blender (check out the two videos there!):

[https://marketsplash.com/tutorials/unity-3d/how-to-import-3d-models-into-unity/]{.underline}

Here's a pretty good and short tutorial showing how to add multiple simple colliders to fit the shape of your object:

[https://www.youtube.com/watch?v=P5F91E_p_zk]{.underline}

This shows how to rotate secondary colliders:

[https://www.youtube.com/watch?v=lr09elWiRqo]{.underline}

Important:

Tip: There are many free templates to download

[https://sketchfab.com/features/free-3d-models]{.underline}

Be careful with the polygon counter! Think about bad graphics cards in VR...

Look for "game ready", "PBR" and "lowpoly" for (hopefully) attractive optimized models.

However, if you get any paid model, please do not share the original files here, just like the ROMs! However, sharing the exported .ucg file is fine.

------------------------------------------------------

Here are some additional details about importing models into Unity:

  1. Download and import models in Unity:

  2. Add collisions:

    • Collisions are essential for objects to interact correctly in

      the game.

    • It uses primitive colliders (such as boxes, spheres, and

      capsules) to adjust the shape of objects.

    • Avoid mesh colliders whenever possible, as they can affect

      performance.

    • Remember that colliders must match the shape of the object to

      prevent them from passing through other objects.

  3. Model optimization:

    • When looking for free models, consider the number of polygons

      (polycount).

    • Look for "game ready" models, with PBR textures and optimized

      for efficient performance.

    • Don't share original paid files, but you can share the exported

      .ucg file.

Good luck with your creations in Unity! 🎮🌟

---------------------------------------------------------

5 - [ Creation of Screens and Televisions ]

This process starts the same way you've already learned to import the TV model, and then we'll learn about the additional parts needed, such as screen meshes, ScreenController component, cable plugs, and push buttons.

  1. Import your TV model.

  2. Configure the UGC Info component, colliders, Selectable, etc. (See

    previous tutorials).

  3. screen mesh: This is the part where the dynamic texture of the

    game will be rendered.

Simple / Using predefined screens:

  • Drag and drop one of the predefined screen meshes from the UGC

    Kit/Helper Prefabs/Screen Meshes folder into your asset and adjust it as needed. (Do not change the name of the object.)

  • Try to get it to touch the edges of the TV frame. It's good to let

    it penetrate the edges a little and make sure you don't leave any gaps.

  • You can choose between curved or flat tights depending on your

    needs. The flat screen can be easily stretched to become a wide screen.

If your imported TV model comes with a non-removable screen mesh:

  • If the screen part of your imported TV model is welded to the whole

    assembly, that is, it is not detachable, just add the screen mesh sample and try to cover it. Otherwise, you'll need to edit the model using something like Blender to separate the part from the screen.

Advanced / Model your own screen:

  • Screens need a separate child object called "screen_mesh".

  • In your 3D modeling software (e.g. Blender), you'll need to adjust

    the UV mapping to fit a perfect square without distortions.

  • If it's a curved screen, try to make the curvature as smooth as

    possible, like a small section of a very large sphere.

  • Assign this material to your mesh: "UGC

    Kit/Resources/Materials/Screen".

  • If possible, use one of the sample meshes explained above.

  1. Add the component ScreenController to the root object, not to

    the "screen_mesh" object.

The options in the component are described below:

Pixel Mode:

  • Changing these settings also works as "presets", where the other

    options will automatically adjust to the most appropriate values, so you generally won't need to modify most of the other settings.

  • "CRT Slot Mask": Should be used for regular CRT TVs, which is what

    all TVs in EmuVR have been using so far.

  • "LCD": Use for LCD screens such as those found on modern TVs and

    portable devices.

  • "CRT Shadow Mask": Used specifically for PC monitors. Regular TVs

    don't have this.

  • "CRT Aperture Grille": At this time, it has no function (it just

    copies the Shadow Mask option).

  • "None": Only useful if you are trying to force special RetroArch

    shaders with their own subpixel patterns at expanded resolutions, such as the GameBoy DMG shaders.

Aspect Ratio:

  • The default value is "4:3", which is suitable for most screens. If

    you are creating a widescreen TV, type "16:9" here. You can use any fractions (such as "2:1" for a vertical display) or decimals (such as "1.3333," which is equivalent to "4:3").

  • EmuVR will take care of proper stretching or black bars depending on

    the resolution of each game.

Maximum Scratches:

  • The predetermined value is 1". Basically, it is similar to the

    "Screen Scratches" setting in the main menu, but "for this model only." Players can still control the "global" dirt in the menu, and this local value simply defines the maximum dirt this screen can have. Let people decide how they like it! Typically, smaller LCD screens, such as those on portable devices, will look better with a lower value, such as "0.3."

Glass Thickness:

  • The predetermined value is 1". As a general rule, use "0.4" for LCD

    screens and "1" for everything else.

  • The thickness already automatically adjusts with the screen size

    internally, so you don't really need to change this.

  • You should never set it to "0", as it would give the impression that

    the game image is simply "painted" on some plastic.

  • Edge Toggle (Bezel):

  • Enabled by default. Disabling it will remove thin black borders with

    rounded corners. It should be disabled for all LCD screens, such as those on portable devices or modern widescreen TVs. Keep it enabled on CRT displays.

  • Off Texture:

  • You can add a custom texture that will display when the console is

    off but the TV is on. It is similar to the blue screen of "VIDEO" or the gray screen of "RGB".

  • If it is empty, it will display "white noise" on CRT TVs (as seen on

    TVs from the 70s and 80s) or a nearly black image on LCD screens (which is recommended). Please note that portable and arcade screens will automatically turn off with the game anyway (more on this later).

  • Power Indicator Object:

  • Select a secondary object and it will be hidden when the TV is off.

    Useful for small LED lights to let gamers know if their TVs are really on or off.

  • Tip: Even if your TV or monitor doesn't actually have little lights

    like these "in real life," it's useful to add them in EmuVR to help players know they're working.

  • There is an example prefab that you can drag from "UGC Kit/Helper

    Prefabs/Misc/Power Light". You can also see how the TV sampler does it here: Importing a simple model).

  • Power Switch Sound:

  • Add a sound effect to play when you turn the screen on or off. There

    are many examples to choose from in this folder: "UGC Kit/Sounds/Systems".

5. Cable Plugs: These are necessary to connect TVs to consoles.

  • Drag and drop one of the sample prefabs from "UGC Kit/Helper

    Prefabs/Cable Plugs" into your asset.

  • Move and rotate it where the cable plug should be on your TV model,

    such as the RF or RCA connectors. You'll see a preview of what it will look like with cables in-game.

  • Disable the "Is System" property in its "Cable Socket" component.

  • The "Plug Object" property is a secondary object that will only be

    visible when the cable is connected.

  • Sample prefabs come with several variations, including one, two, or

    three colored plugs (with small forked cable ends, necessary since only one actual cable coming out of your TV will be represented).

  • If the multi-plug prefab doesn't line up perfectly with the

    connectors on your TV model, you can move them as needed, while trying to scale the forked cable end so that it still follows them.

  • If you need a different type of plug, or if the branched cable end

    doesn't fit, you'll need to import or use a 3D modeler to create your own.

  • A display cannot be used without a cable plug. (With the exception

    of handheld devices and arcade machines that may have "embedded" screens. More on that later.)

6. Pressable Buttons:

  • Add interactive buttons that players can press in VR to turn on the

    TV or change the volume.

  • Drag and drop this prefab onto your asset: "UGC Kit/Helper

    Prefabs/Finger Buttons/Finger Button".

  • Place it over your power button.

  • Set the "Action Type" property of the "Finger Gesture" component to

    "Toggle Power".

  • This one comes with a collider; You'll need to adjust it to fit the

    shape of your button on the outside, but expand it a few inches "inside" the TV (about the length of an index finger), as if following the movement the player will make when pressing it.

  • The magenta arrow in the scene shows the direction in which the

    button can be pressed. You can change it in the "Direction" property of the "Finger Gesture" component.

  • To help players know that they can interact with the buttons, they

    should be highlighted when touched.

<!-- -->
  • Use the Highlight object to assign any object within the asset that

    will display an outline while the button is tapped.

  • If your models have separate meshes/objects for the buttons, simply

    select them here.

  • If the button is not movable or detachable, it is simply a fixed

    part of the entire mesh, or even if it is just a fake button of a texture, you can follow these steps:

    • Create a "fake" child object, such as a cylinder or cube.

    • Move it and scale it to roughly fit your fake button.

    • Mark it as your property "Highlight Object".

    • Make sure to hide this fake object; It won't hide

      automatically, but it will still work.

    • This is how PS1 buttons are actually made, for example, since

      they are just textures.

  • Finally, do the same for the "Volume Up" and "Volume Down" buttons

    (it may be faster to duplicate and adjust them). Remember to change its function in the "Action Type" property.

Ready to bring your virtual TVs to life! 📺💡

6 - [Creating systems]

Here we will learn how to create consoles, configure their supported media, cable plugs, interactive buttons, sound effects and more.

To create console systems in EmuVR, follow these steps:

  1. Import your console model: Use the techniques you've learned in

    previous tutorials to import the console model you want to add.

  2. Add the Game System component:

    • In your console model, add the "Game System" component.

    • Set the "Compatible Media" property to the exact names of the

      media you want the console to accept. For example:

      • "Neo Geo (Cartridge)"

      • "Game Boy / Game Boy Color"

      • "PlayStation"

      • "PlayStation 2 (DVD)"

    • You can make your console compatible with multiple media

      separated by "|". For example: "Wii|GameCube" or "Nintendo 64|SNES|NES|Famicom".

    • This setting is not related to the console name. You can name

      your console whatever you want, but it will still use the media names specified in this property.

    • If your console uses discs, add "|media=disc" to the end of the

      media name. For example: "Sega Saturn|media=disc", "Sega Dreamcast|media=disc", "Xbox 360|media=disc".

    • This will automatically cause the console media to use the

      default EmuVR disk model in the inventory, so you won't need to create your own disk assets for these consoles later (as you will for cartridges).

    • If you are creating a new console that uses media not present in

      Game Scanner (for example, Xbox, PS3, Wii U, and generally anything that Retroarch does not emulate), you will also need to add these new media to a special file called "custom_media. txt" for Game Scanner to accept them and display them in the inventory, as explained here: [Custom Media]{.underline}.

  3. Sockets: These are the spaces where you can insert the games.

    • Drag and drop the following prefab onto your asset: "UGC

      Kit/Helper Prefabs/Sockets/System Socket". If you are creating a disk-based console, use "System Socket (CD)" instead.

    • This will show a preview of what the cartridge will look like

      after being inserted. Use it to position it correctly as the cartridge (or CD) slot on your console.

    • If you've already created the cartridge UGC for this console

      (we'll learn about it in another tutorial), you can assign its prefab to the "Preview Prefab" property here and turn on the "Transparent Mode" option to see an accurate preview of how it will look on EmuVR.

    • The socket collider represents the volume that, when

      intersecting with the socket of the grasped cartridge, will activate the highlight meaning "will be inserted if released now." This means that the collider must extend outside and inside your console. View sample assets.

    • If you are creating a disc-based system, be sure to set "Free

      Attachment Rotation" to "Y", otherwise it will be difficult for players to insert them into VR mode.

4. Add the Game System State component:

  • The animations will be explained later with the "System Procedural

    Animator" component in another tutorial: System Animations.

  • He "Power Indicator Object" works the same way as on screens, as

    previously explained here: Creating Screens, TVs (See also the console example linked there for a real-life example.)

  • "Needs Media To Close": Some systems don't need to use the

    "opening" animation before inserting a game, for example VHS tapes or slot-loading DVD drives (like the Wii), where you just push them in. For these systems, enable the "Needs Media To Close" option. (Otherwise, the empty console would still require users to run the "open" command to play an "invisible opening" animation before being able to insert a game, which is very confusing.)

  • For systems where you can open and close a tray or lid even without

    games (e.g. PS1, PS2, GameCube, NES), keep the "Needs Media To Close" option disabled.

  • This option has no effect if you are not using opening or closing

    animations.

  • "Can Play While Open" (Can Play While Open): Since disc swapping

    is not supported yet, the consoles will simply turn off when you open the tray. Some custom systems currently use the "opening" animation differently, for example to open and close NDS or 3DS systems. Enabling this setting will allow you to do this without the console shutting down. Technically, this will also allow a disc console like the PS1 to continue running after you open the lid (and it will continue to spin), but it will still turn off as soon as you grab the disc.

  • "Disc Spindle" (Disc Axis): If you are creating a disk-based

    console where you can see the disk spinning:

  1. Creates an empty spindle object.

  2. Move it exactly to the place where the disk would spin from.

  3. Drag your Socket object onto this axis to set it as a child. Make

    sure to reset the local position and rotation of the socket to 0 within the axis.

  4. Assigns the spindle to the "Disc Spindle" property.

  5. Set the "Spindle Axis" to point "up" (usually X: 0, Y: 1, Z: 0).

You should only enable this for top-loading consoles where you will open a lid and directly place the disc on the spindle (e.g. PS1, GameCube, Dreamcast, Saturn), but not if they have retractable trays (e.g. PS2, Xbox 360, PC ) or slot-loading drives that "swallow" the disc (e.g. PS3, Wii, Wii U), or otherwise could cause errors such as floating discs.

Cable Plugs: These are necessary to connect the consoles to the televisions. They work in the same way as with televisions, as explained here: Creation of Screens, TVs. The only difference is making sure "Is System" is enabled in this case.

Push Buttons: They also work the same way as with televisions, as explained here: [Creation of Screens, TVs.]{.underline}

  • deer "Open Toggle" if the same button opens and closes the lid

    (e.g. PS2).

  • deer "Open" if the button only opens the lid but does not close

    it (e.g. PS1, GameCube).

  • Add a button "invisible" "Close" button on the tip of the lid

    (with a wide enough collider and appropriate direction) to allow users to close it with their finger (e.g. PS1, GameCube, NES). Don't make the collider cover the entire cap, just the tip, the part that touches.

  • Even if the system has a mechanical "close" button, you can still

    add a secondary shutdown button. "Close" on the lid as explained above to allow users to also close them with their hands (e.g. PS1, GameCube, PS2).

  • For manual lids where there is no "button" and you need to

    open them with your hands (for example, NES), add a button "invisible" "Open" button on the tip of the lid itself (with a wide enough collider and proper direction) to allow users to open it with their finger (e.g. NES, but not PS1, PS2, or GameCube). Don't make the collider cover the entire cap, just the tip, the part that touches.

  • deer "Toggle Power" if the same button press turns it on and off

    (e.g. PS1, PS2, NES, GameCube).

  • deer "Power On" and enable "Two-Way Mode" if you have a "slider"

    button that you move back and forth and it stays in the "on" and "off" positions (e.g. SNES, N64).

Sound effects:

  1. Add the component "Game System SFX component" (Game System SFX).

  2. Choose your favorite samples from "UGC Kit/Sounds/Systems" (these

    are the same sounds used in EmuVR), or import your own audio files to another folder.

Animations:

  • Systems can have animations for the following actions: "Power on,"

    "Off," "Reboot," "Open," "Close," and "Insert."

  • Although not required, the animations really add fun and

    authenticity.

Special cases:

  1. **Systems with Built-in Screens (for example, portable consoles and

    arcade machines):**

    • Add a component ScreenController to the root object.

    • Follow the same instructions used to create televisions (as

      explained in Creating Screens, TVs).

    • In this scenario, a cable plug is not required, but you can

      still add one to allow your portable system to optionally connect to other TVs (similar to connecting a Nintendo Switch). Make sure "Is System" is enabled.

    • Alternatively, you can add a cable plug with "Is System"

      disabled, allowing your portable system or arcade machine to also function as a television. This would allow you to connect external consoles to your arcade machine model.

  2. Standalone Systems (for example, record or cassette players):

    • For these systems, you will still need to add a component

      ScreenController.

    • Instead of adding a "screen_mesh" object, create an empty child

      object with the exact name "screen_empty". Cable plugs are not necessary in this case.

7 - [Systems Animation]

Systems Animations: Although not required, system animations add fun and authenticity. You can use animations for the "On", "Off", "Restart", "Open", "Close" and "Insert" actions.

Some systems that do not have lids or trays will not need the "Open" and "Close" animations. Since "On", "Off", and "Reset" animations are usually related to buttons, some systems with "fake buttons" made of textures may not need these animations.

The "Insert" animation should generally move the "Socket" object (or its parent) to its "fully inserted" position. The "Withdraw" animation is not fully developed at this time and is not really needed for now.

There is a component to easily create quick and simple animations for systems, it is called "System Procedural Animator"

Let's learn how to create animations for our console example, the Sega Master System. The component starts like this:

{width="4.364583333333333in" height="2.0208333333333335in"}

* We don't have to create all the animations, but only the ones we need for this console.

* Let's make the **"On"** animation. Click to enable it and you will see this:

{width="4.375in" height="3.125in"}

  • In "Transform", assign the object you want to move. In this

    case, we will use the power button object ("power button object").

  • This is pretty simple:

    1. "Initial position" indicates where the object will start

      the animation.

    2. "Final Position" is where the object will move as it

      animates.

    3. The same applies to "Initial Rotation" and "Final Rotation".

  • The ▼ "Down" and ▲ "Up" buttons on the right will "save" and "load"

    the position values ​​from/to the object.

    1. Click the button "Below", and you will get the current

      position and rotation of the object and will "save" the numbers in the component.

    2. Click the button "Above", and it will send this saved

      position and rotation al object, moving it.

  • We have pretty simple steps to create our animation. **"Switched

    on"**:

    1. The power button is already in the "off" position on this model,

      so we will click the button "Below" to save it as "Initial position" (since we will move from "off" to "on" here).

    2. Manually move the button object to the "on" position (in this

      example, we simply press it).

    3. Click the button "Below" to save this new position as the

      "Final Position". This will be the "destination" of the animation.

    4. You'll want to reset the button to its original position before

      exporting the asset (remember we just moved the button from its natural state), so simply click the button "Above" from the "Initial Position" to easily load it again.

  • Quick Summary:

    1. Move it where it belongs begin, ▼ save it.

    2. Move it where it belongs finish, ▼ save it.

    3. Reset the initial position by loading it ▲ again. These

      three steps will quickly become part of your routine.

Our component will now look like this:

{width="4.375in" height="3.1458333333333335in"}

Now let's move on to the next step: create the animation of "Off", so click to enable it. Advice:

  • Usually this is simply the reverse of the animation of

    "Switched on".

  • This means that you can copy and paste the values ​​from the "Power

    On" animation, but exchanging the Start and End fields.

  • It's even faster to simply click the "up" and "down" buttons

    between both animations to copy them. It will be like three clicks and that's it! Following! 👌

This is what it will look like:

{width="4.385416666666667in" height="4.260416666666667in"}

Now comes the interesting part: the "Curve" field.

  • Instead of just mechanically moving the button from point A to point

    B, we can use a customizable curve that will control the speed, timing, and movement of the animation.

  • This allows us to make the animations look smoother, more elastic,

    more impactful, etc. At the same time, they feel more cartoonish and realistic. You will understand it better by watching this animation:{width="2.5052088801399823in" height="3.00625in"}

  • This tool already comes with pre-designed curves that I created for

    the usual animations, so you only need to choose one from the dropdown menu:

{width="4.375in" height="4.291666666666667in"}

  • For most buttons, you'll want to use "Button Switch", and for

    sliders (e.g. SNES, N64), "Button Switch On / Off".

  • Tip: If you are animating a button that simply "clicks" but does not

    stay in an "on" position and returns instantly (for example, most "Reset" and "Open" buttons on consoles), use the special curve "Button Press 1", which does just that: it goes to the assigned end position and then returns to the start in the same animation.

  • Select "Custom" and you can edit your own curves for each animation.

  • If you wish keep your custom curve into a reusable file, click

    the button with the small file icon on the right. You can then load it later with the "From Active" option in this same drop-down menu, either for other animations or systems.

_ _

  • Next, we will create the animation of "Insert" for our

    cartridge socket.

    1. Click "Insert" to enable it.

    2. Assign the child object "System Socket" from the console to

      "Transform".

    3. Its current default position (which is the "inserted" position)

      will be our "Final Position", so let's start by clicking to "save" it first. (We are inserting it, so it ends up "inserted".)

    4. Move the socket up a little. This will be ours **"Initial

      position"**, so let's "save it."

    5. Don't forget to reset the position of the socket by loading the

      "Final Position" again.

    6. Select the curve "Insert Cart 1" for this, and that's it!

  • Quick Summary:

    1. Save the initial state as "Final Position" first.

    2. Move it up and save it as "Home Position".

    3. Reset the position again and select a curve. For the "Open" and

      "Close" animations, you will want to select and move the object from the tray or lid. If you are rotating a lid, make sure the "pivot" of the object is right at the origin of the rotation. Tip: If you don't want to use a 3D modeler to change the pivot, simply create an empty object as the parent, move the cap as needed, and assign this parent as the rotating "Transform" instead. _ _

    4. Finally, we can click the button "Bake Animations", which

      will generate the actual animation assets for each slot we have enabled.

  • These new files will be created in your project's root folder, at

    the bottom. You can then move them to any other folder you want to organize them, such as the "Animations" folder on your console. (Do not rename these files!) In our example, the files will look like this:

{width="1.34375in" height="0.65625in"}

  • They will be automatically assigned to each animation slot in the

    component Game System State of the same UGC prefab. That's where they are intended to be used. He System Procedural Animator exists only for create them.

  • If you adjust your animations later and click "Bake Animations"

    again, the saved animation files will simply update wherever they are, even if you have moved them to a new folder. So it's easy to make adjustments and get back to baking. Advanced:

  • If you know how to animate using Unity or 3D modeling programs like

    Blender, you can assign your own exported animation files to the slots in Game System State instead of using this generator.

  • This would be necessary for more complex animations that are not

    simply "a single object moving from point A to point B", such as animating a VHS tape or NES cartridge being inserted with sequential movements (or multiple objects). But for simple animations, you'll probably find that the generator is still faster to use.

  • You can combine procedurally generated animations with your own

    files in the Game System State component. Finally, our components will look like this:

{width="4.100843175853019in" height="9.161458880139982in"}

Mission complete, your console is ready to be exported!

8 - [Custom Media]

Some types of custom consoles and cartridges will need a special setting called Custom Media, and here we'll learn how to use it. Some UGC consoles and cartridges are made for what is already listed on Game Scanner, basically replacing the "Generic Console/Cartridge" for items like Sega Genesis, Neo Geo, Wii, etc.

But you can also add a completely new element, for example PS3, Xbox 360, Wii U, etc (usually systems not emulated by RetroArch, where you use the Window Capture core instead) or simply new color variations for the media existing ones, which will need to be a new asset (e.g. red SNES cartridge, yellow N64 cartridge, etc).

To be able to see a new console or cartridge in the game if it is not already available in Game Scanner, you will need to add new values ​​to a special file custom_media.txt, according to the instructions of the creator of the UGC asset for this model. * You are alone downloading UGC from others:

  • Summary for users: If a UGC console creator says "Custom Media:

    This and That", be sure to add "this and that" a custom_media.txt and select the new entry in Game Scanner. If they don't mention it, it's not necessary.

  • A console or media file download may have some additional notes

    added by the author, like this: Custom media: something something

  • This means you will need to open (or create) the "custom_media.txt"

    file in your Game Scanner folder, then copy and paste this "something something" part as a new line.

  • After that, open Game Scanner to select the new media (in the Media

    dropdown, usually listed in the "Custom" category) for your desired folder, and scan.

  • For example, when downloading a PlayStation 3 UGC file, the creator

    might say Custom media: PS3

    • With Just add PS3 as a new line in your custom_media.txt file

      and configure your Game Scanner.

  • A red Game Boy cartridge could say Custom Media: Game Boy/Game Boy

    Color (Red) = "Game Boy/Game Boy Color"

    • Copy and paste this as a new line into your txt file: Game Boy /

      Game Boy Color (Rojo) = "Game Boy / Game Boy Color"

  • This is about the media and not the console, so don't worry if

    you're adding a "Purple N64" console and no one has mentioned any Custom Media. It will simply use normal N64 cartridges and continue to appear in your inventory, with no additional steps required for Game Scanner. * Are creating a new model of console:

  • If you take on new media that isn't already in Game Scanner (e.g.

    Xbox 360, PS3, Wii U), let users know what to add to custom_media.txt by mentioning it with your uploaded UGC: "Custom Media: Xbox 360"

  • If you take any means ya in Game Scanner, even if it is a new

    console model replacing the generic console (e.g. Atari 2600, Famicom, Sega Genesis), you won't need to advertise any Custom Media, it will just work.

  • Remember this is about your media and not the console itself. If

    you are an N64 Purple, it should take normal N64 cartridges, and "Custom Media" should not be necessary.

    • More examples of console variations for existing media: PS2

      Slim, PS One, NES Top Loader, DVD player, a new VCR player, etc. * Are creating a new model of cartridge:

  • If it is a new half not yet in Game Scanner (e.g. PS Vita), let

    users know what to add to custom_media.txt mentioning it with your uploaded UGC: "Custom Media: PS Vita"

  • If it is a new one variation from an existing media (for

    example, "SNES (Red)", "Nintendo 64 (Yellow)"), you can easily "copy" the properties of the original SNES or N64 media in this way:

    • In it Socket Media Name of your asset, write **"SNES

      (Red)>SNES"**.

      • This will automatically make your "SNES (Red)" cartridge

        compatible with all consoles (current, or yet to be created) that are compatible with "SNES" cartridges. Following our N64 example, it would be: "Nintendo 64 (Yellow)>Nintendo 64".

    • For users, tell them Custom Media: SNES (Red) = "SNES" (O

      Custom Media: Nintendo 64 (Yellow) = "Nintendo 64"). This is what they will add to their custom_media.txt. This will add your cartridge variation to Game Scanner and automatically include all cores already supported by the old "SNES" or "Nintendo 64" entries in the list. Remember that the aforementioned "Purple N64 console" from the other previous topic would already take normal N64 cartridges and did not need any "Custom Media". This means that it would also already accept your yellow N64 cartridges (if the cartridge is correctly configured per the points above.) Remember, if you are making a new disc-based console you do not need to create a new disc model for it, but simply add "| media=disk" to GameSystem's "Compatible Media". _ _

<!-- -->
  • Advanced: How it really works custom_media.txt:

    • If you add this line: Palm OS = "mu_libretro" will add a new

      "Palm OS" media to the media dropdown, which will have the "Mu" core in its own core dropdown on the right. More examples: Tomb Raider = "openlara_libretro" O Minecraft = "craft_libretro" O OutRun = "cannonball_libretro"

    • You can actually add multiple cores to the same media, separated

      by | like this: Super Magic System = "snes9x_libretro|genesis_plus_gx_libretro|mednafen_psx_libretro"

    • You can also simply "copy" the available cores from another

      existing media in GS, e.g. Game Boy / Game Boy Color (Amarillo) = "Game Boy / Game Boy Color" will add your new yellow GB cartridge and it will automatically list all the cores already available on the original half GB, in the core dropdown on the right.

    • You can also "copy" from multiple media separated by |, and

      even mix and match with kernels, like this: Windows (CD) = "DOS (CD)|Wii|snes9x_libretro|wgc_libretro"

    • You can write any media that already exists for add any

      extra core to it. For example, we can add the core "Play!" again like this: PlayStation 2 (DVD) = "play_libretro"

    • Finally, if you write only the name of the coreless media, such

      as PlayStation 3 O Life O Wii U, the Window Capture core will automatically be used. * Advanced summary:

    • Adding new media with new cores? Uses New Media Name =

      "new_libretro_core|other_new_libretro_core"

    • Adding a new color variation medium that only needs to copy the

      same cores from the old medium? Use for example SNES (Red) = "SNES"

    • Adding a new core to an existing medium? Use for example

      Nintendo 64 = "snes9x_libretro"

    • Adding a new media that will only use the Window Capture core?

      Just add New Media Name

    • The left side of this value (for example, SNES (Red)) is what

      you will add to the Compatible Medium the tu GameSystem.

    • If it is a game, it is added to the Socket Media Name of

      your game, added by the original medium, such as SNES (Red)>SNES.

9 - [ Creating Media / Cartridges ]

To write.

This is the last major tutorial, and it will be written soon. If you can't wait and want to try it yourself, here are some quick, unorganized tips:

  • Study the SMS cartridge example in the "UGC Examples" package.

  • The socket should be centered on the bottom of the mesh. Take a cue

    from the collider, it's supposed to stick out of the model.

  • The "Media Name" must go in the socket, exactly as shown in Game

    Scanner, and following the rules explained at https://discord.com/channels/494312532782088203/1189035859199152158

  • The label object must be named "media_label" and must use the

    included "Label" material.

  • You will need to learn how develop UV the mesh label with a **3D

    modeler** to neatly fill the UV space (a square, avoid distortions). Unfortunately, this step cannot be done with Unity alone.

  • You don't need to make templates for discs, just add "|media=disk"

    to your console's Compatible Media.

  • Make sure you add something like "Cartridge" to the name of the

    asset, such as "Atari 2600 Cartridge". This helps differentiate the file names between consoles and media in the folder. For example, "Atari_2600_f45af3d5.ugc" vs "Atari_2600_Cartridge_87df1b93.ugc".

⚠️ **GitHub.com Fallback** ⚠️