<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.vrchat.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Usr+923acdda-9202-4f4d-91c0-d0d7269c96a5</id>
	<title>VRChat Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.vrchat.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Usr+923acdda-9202-4f4d-91c0-d0d7269c96a5"/>
	<link rel="alternate" type="text/html" href="https://wiki.vrchat.com/wiki/Special:Contributions/Usr_923acdda-9202-4f4d-91c0-d0d7269c96a5"/>
	<updated>2026-06-23T23:37:49Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://wiki.vrchat.com/index.php?title=Guides:UdonSharp_Nitpicks&amp;diff=71937</id>
		<title>Guides:UdonSharp Nitpicks</title>
		<link rel="alternate" type="text/html" href="https://wiki.vrchat.com/index.php?title=Guides:UdonSharp_Nitpicks&amp;diff=71937"/>
		<updated>2026-05-03T20:11:33Z</updated>

		<summary type="html">&lt;p&gt;Usr 923acdda-9202-4f4d-91c0-d0d7269c96a5: Added missing section, fixed a typo.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Noticebox/Community}}{{Noticebox/wip}}Here are some things that [[User:Usr 923acdda-9202-4f4d-91c0-d0d7269c96a5|Fax]] considers useful or practical when writing U# code, in no particular order.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;This page was originally posted on [https://vrclibrary.com/wiki/books/faxs-retrospectives-and-prefabs/page/udonsharp-nitpicks VRCLibrary], and was updated for the VRChat wiki. These suggestions are somewhat personal, so if you have any suggestions, please discuss them!&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Attributes =&lt;br /&gt;
Attributes, such as &amp;lt;code&amp;gt;[SerializeField]&amp;lt;/code&amp;gt;, can help make your classes, variables, or methods more useful.&lt;br /&gt;
&lt;br /&gt;
=== UdonBehaviourSyncMode ===&lt;br /&gt;
Use U#&#039;s &amp;lt;code&amp;gt;[https://udonsharp.docs.vrchat.com/udonsharp/#udonbehavioursyncmode UdonBehaviourSyncMode]&amp;lt;/code&amp;gt; attribute to make sure your &amp;lt;code&amp;gt;UdonBehaviour&amp;lt;/code&amp;gt; always uses the sync mode you intended. For example:&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot;&amp;gt;using UdonSharp;&lt;br /&gt;
using UnityEngine;&lt;br /&gt;
&lt;br /&gt;
[UdonBehaviourSyncMode(BehaviourSyncMode.Manual)] &lt;br /&gt;
public class Foo : UdonSharpBehaviour&lt;br /&gt;
{&lt;br /&gt;
  // This behaviour always uses manual sync.&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;Alternatively, you can choose the sync mode UdonBehaviours in the Unity inspector. This is more flexible and allows you to use different sync modes for different instances of the same behaviour - but that&#039;s a very rare use case. Instead, you may accidentally select the wrong mode without realizing it, causing networking to break unexpectedly. &amp;lt;code&amp;gt;UdonBehaviourSyncMode&amp;lt;/code&amp;gt; is usually more reliable.&lt;br /&gt;
&lt;br /&gt;
=== SerializeField ===&lt;br /&gt;
Use the &amp;lt;code&amp;gt;[SerializeField]&amp;lt;/code&amp;gt; attribute to make &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt; variable visible in the Unity inspector, allowing you to assign references to assets or scene objects:&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
[SerializeField] private Transform foo; // This shows up in the Unity inspector.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Instead of using &amp;lt;code&amp;gt;[SerializeField]&amp;lt;/code&amp;gt;, you can make the variable &amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt; instead. However, this &#039;&#039;&#039;also&#039;&#039;&#039; makes those variables accessible from any other UdonBehaviour. If that&#039;s what you want, you should consider using &amp;lt;code&amp;gt;[HideInInspector]&amp;lt;/code&amp;gt; attribute to prevent your public variables from causing clutter in the inspector.&lt;br /&gt;
&lt;br /&gt;
=== Tooltip and Header ===&lt;br /&gt;
Use the &amp;lt;code&amp;gt;[Header]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[Tooltip]&amp;lt;/code&amp;gt; attributes to organize variables in the Unity inspector. For example:&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot;&amp;gt;&lt;br /&gt;
[Header(&amp;quot;Materials&amp;quot;)]&lt;br /&gt;
[SerializeField] private Material materialFoo;&lt;br /&gt;
[SerializeField] private Material materialBar;&lt;br /&gt;
[SerializeField] private Material materialBaz;&lt;br /&gt;
&lt;br /&gt;
[Header(&amp;quot;Transforms&amp;quot;)]&lt;br /&gt;
[Tooltip(&amp;quot;This tooltip appears when hovering your mouse over transformFoo in the inspector.&amp;quot;)]&lt;br /&gt;
[SerializeField] private Transform transformFoo;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Networking =&lt;br /&gt;
This section contains some tips related to networking and synchronizing changes between players.&lt;br /&gt;
&lt;br /&gt;
=== Call OnDeserialization locally ===&lt;br /&gt;
When the networking owner of an UdonBehaviour uses &amp;lt;code&amp;gt;RequestSerialization()&amp;lt;/code&amp;gt;, all players &#039;&#039;&#039;except&#039;&#039;&#039; the owner execute &amp;lt;code&amp;gt;OnDeserialization()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
But if you override &amp;lt;code&amp;gt;OnDeserialization()&amp;lt;/code&amp;gt; in your script, the owner can manually execute it. This is useful if you&#039;d like the owner of the script to execute &amp;lt;code&amp;gt;OnDeserialization()&amp;lt;/code&amp;gt;, to replicate the same behaviour as other players.&lt;br /&gt;
&lt;br /&gt;
For example, the following script allows the owner to increase a &amp;lt;code&amp;gt;score&amp;lt;/code&amp;gt; variable and update &amp;lt;code&amp;gt;scoreText&amp;lt;/code&amp;gt; for all players:&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;[UdonSynced] private int score;&lt;br /&gt;
[SerializeField] private TextMeshProUGUI scoreText;&lt;br /&gt;
&lt;br /&gt;
// If the owner calls the method below, the score increases by one.&lt;br /&gt;
private void IncreaseScore()&lt;br /&gt;
{&lt;br /&gt;
  if (!Networking.IsOwner(gameObject)) return;&lt;br /&gt;
  score++;&lt;br /&gt;
  RequestSerialization();&lt;br /&gt;
  OnDeserialization();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public override void OnDeserialization()&lt;br /&gt;
{&lt;br /&gt;
  scoreText.text = score.ToString();&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;Note that &amp;lt;code&amp;gt;OnDeserialization()&amp;lt;/code&amp;gt; &#039;&#039;without&#039;&#039; parameters is a deprecated method. More complex scripts may require &amp;lt;code&amp;gt;OnDeserialization(DeserializationResult)&amp;lt;/code&amp;gt; , so consider the following approach:&lt;br /&gt;
&lt;br /&gt;
# Write your own method, e.g., &amp;lt;code&amp;gt;UpdateScoreText()&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Make the owner call it immediately after &amp;lt;code&amp;gt;RequestSerialization()&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Make remote players call it from &amp;lt;code&amp;gt;OnDeserialization(DeserializationResult result)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== FieldChangeCallback ===&lt;br /&gt;
Use the &amp;lt;code&amp;gt;[FieldChangeCallback]&amp;lt;/code&amp;gt; attribute to respond to synced variable changes without using &amp;lt;code&amp;gt;OnDeserialization()&amp;lt;/code&amp;gt;. For example:&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;[SerializeField] private TextMeshProUGUI scoreText;&lt;br /&gt;
[UdonSynced, FieldChangeCallback(nameof(Score))] private int score;&lt;br /&gt;
&lt;br /&gt;
private bool Score&lt;br /&gt;
{&lt;br /&gt;
  get =&amp;gt; score;&lt;br /&gt;
  set&lt;br /&gt;
  {&lt;br /&gt;
    score = value;&lt;br /&gt;
    scoreText.text = score.ToString();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// If the owner calls the method below, the score increases by one.&lt;br /&gt;
private void IncreaseScore()&lt;br /&gt;
{&lt;br /&gt;
  if (!Networking.IsOwner(gameObject)) return;&lt;br /&gt;
  Score++;&lt;br /&gt;
  RequestSerialization();&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;This approach is especially useful for synced variables that interact with your scene in simple ways, e.g., updating text or animators. You can still use &amp;lt;code&amp;gt;OnDeserialization()&amp;lt;/code&amp;gt; elsewhere, where appropriate. Especially because &amp;lt;code&amp;gt;[FieldChangeCallback]&amp;lt;/code&amp;gt; has a drawback that&#039;s easy to forget:&lt;br /&gt;
&lt;br /&gt;
=== FieldChangeCallback execution order issues ===&lt;br /&gt;
&#039;&#039;Note: This section has not been proofread yet! It may contain factual errors.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If you use &amp;lt;code&amp;gt;[FieldChangeCallback]&amp;lt;/code&amp;gt;to execute cute, avoid referencing other variables that may not have been deserialized yet. For example:&amp;lt;syntaxhighlight&amp;gt;[SerializeField] private TextMeshProUGUI scoreText;&lt;br /&gt;
[SerializeField] private TextMeshProUGUI roundText;&lt;br /&gt;
[UdonSynced, FieldChangeCallback(nameof(Score))] private int score;&lt;br /&gt;
[UdonSynced] private int round;&lt;br /&gt;
&lt;br /&gt;
private bool Score&lt;br /&gt;
{&lt;br /&gt;
  get =&amp;gt; score;&lt;br /&gt;
  set&lt;br /&gt;
  {&lt;br /&gt;
    score = value;&lt;br /&gt;
    scoreText.text = score.ToString();&lt;br /&gt;
    roundText.text = round.ToString(); // ⚠️ round might be outdated for remote players!&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// If the owner calls the method below, the score and round increase by one.&lt;br /&gt;
private void IncreaseScoreAndRound()&lt;br /&gt;
{&lt;br /&gt;
  if (!Networking.IsOwner(gameObject)) return;&lt;br /&gt;
  round++;&lt;br /&gt;
  Score++; // ⚠️ Only the owner will see the round and score text correctly.&lt;br /&gt;
  RequestSerialization();&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;That&#039;s because &amp;lt;code&amp;gt;[FieldChangeCallback]&amp;lt;/code&amp;gt; may execute &#039;&#039;before&#039;&#039; all synced variables have been deserialized. You may accidentally use outdated values without realizing it! Instead, use &amp;lt;code&amp;gt;OnDeserialization&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;SendCustomEventDelayed&amp;lt;/code&amp;gt; to wait until all variables are deserialized. &lt;br /&gt;
&lt;br /&gt;
== Optimization ==&lt;br /&gt;
These tips can help reduce the CPU utilization caused by your scripts.&lt;br /&gt;
&lt;br /&gt;
=== Cache LocalPlayer ===&lt;br /&gt;
Cache &amp;lt;code&amp;gt;Networking.LocalPlayer&amp;lt;/code&amp;gt; by saving it as a local variable. Re-use the variable instead of calling &amp;lt;code&amp;gt;Networking.LocalPlayer&amp;lt;/code&amp;gt; again. For example:&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot;&amp;gt;&lt;br /&gt;
private VRCPlayerApi localPlayer;&lt;br /&gt;
&lt;br /&gt;
private void Start()&lt;br /&gt;
{&lt;br /&gt;
  localPlayer = Networking.LocalPlayer;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
private void Update()&lt;br /&gt;
{&lt;br /&gt;
  Debug.Log(localPlayer.GetPosition());&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;This &#039;&#039;slightly&#039;&#039; improves the performance of your behaviour, especially if you reference the local player one or more times per update.&lt;/div&gt;</summary>
		<author><name>Usr 923acdda-9202-4f4d-91c0-d0d7269c96a5</name></author>
	</entry>
	<entry>
		<id>https://wiki.vrchat.com/index.php?title=Guides:UdonSharp_Nitpicks&amp;diff=71931</id>
		<title>Guides:UdonSharp Nitpicks</title>
		<link rel="alternate" type="text/html" href="https://wiki.vrchat.com/index.php?title=Guides:UdonSharp_Nitpicks&amp;diff=71931"/>
		<updated>2026-05-02T19:43:12Z</updated>

		<summary type="html">&lt;p&gt;Usr 923acdda-9202-4f4d-91c0-d0d7269c96a5: Created page with &amp;quot;{{Noticebox/Community}}{{Noticebox/wip}}Here are some things that Fax considers useful or practical when writing U# code, in no particular order.  &amp;#039;&amp;#039;This page was originally posted on [https://vrclibrary.com/wiki/books/faxs-retrospectives-and-prefabs/page/udonsharp-nitpicks VRCLibrary], and was updated for the VRChat wiki. These suggestions are somewhat personal, so if you have any suggestions, please discuss them!&amp;#039;&amp;#039;  = A...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Noticebox/Community}}{{Noticebox/wip}}Here are some things that [[User:Usr 923acdda-9202-4f4d-91c0-d0d7269c96a5|Fax]] considers useful or practical when writing U# code, in no particular order.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;This page was originally posted on [https://vrclibrary.com/wiki/books/faxs-retrospectives-and-prefabs/page/udonsharp-nitpicks VRCLibrary], and was updated for the VRChat wiki. These suggestions are somewhat personal, so if you have any suggestions, please discuss them!&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Attributes =&lt;br /&gt;
Attributes, such as &amp;lt;code&amp;gt;[SerializeField]&amp;lt;/code&amp;gt;, can help make your classes, variables, or methods more useful.&lt;br /&gt;
&lt;br /&gt;
=== UdonBehaviourSyncMode ===&lt;br /&gt;
Use U#&#039;s &amp;lt;code&amp;gt;[https://udonsharp.docs.vrchat.com/udonsharp/#udonbehavioursyncmode UdonBehaviourSyncMode]&amp;lt;/code&amp;gt; attribute to make sure your &amp;lt;code&amp;gt;UdonBehaviour&amp;lt;/code&amp;gt; always uses the sync mode you intended. For example:&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot;&amp;gt;using UdonSharp;&lt;br /&gt;
using UnityEngine;&lt;br /&gt;
&lt;br /&gt;
[UdonBehaviourSyncMode(BehaviourSyncMode.Manual)] &lt;br /&gt;
public class Foo : UdonSharpBehaviour&lt;br /&gt;
{&lt;br /&gt;
  // This behaviour always uses manual sync.&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;Alternatively, you can choose the sync mode UdonBehaviours in the Unity inspector. This is more flexible and allows you to use different sync modes for different instances of the same behaviour - but that&#039;s a very rare use case. Instead, you may accidentally select the wrong mode without realizing it, causing networking to break unexpectedly. &amp;lt;code&amp;gt;UdonBehaviourSyncMode&amp;lt;/code&amp;gt; is usually more reliable.&lt;br /&gt;
&lt;br /&gt;
=== SerializeField ===&lt;br /&gt;
Use the &amp;lt;code&amp;gt;[SerializeField]&amp;lt;/code&amp;gt; attribute to make &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt; variable visible in the Unity inspector, allowing you to assign references to assets or scene objects:&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
[SerializeField] private Transform foo; // This shows up in the Unity inspector.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Instead of using &amp;lt;code&amp;gt;[SerializeField]&amp;lt;/code&amp;gt;, you can make the variable &amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt; instead. However, this &#039;&#039;&#039;also&#039;&#039;&#039; makes those variables accessible from any other UdonBehaviour. If that&#039;s what you want, you should consider using &amp;lt;code&amp;gt;[HideInInspector]&amp;lt;/code&amp;gt; attribute to prevent your public variables from causing clutter in the inspector.&lt;br /&gt;
&lt;br /&gt;
=== Tooltip and Header ===&lt;br /&gt;
Use the &amp;lt;code&amp;gt;[Header]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[Tooltip]&amp;lt;/code&amp;gt; attributes to organize variables in the Unity inspector. For example:&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot;&amp;gt;&lt;br /&gt;
[Header(&amp;quot;Materials&amp;quot;)]&lt;br /&gt;
[SerializeField] private Material materialFoo;&lt;br /&gt;
[SerializeField] private Material materialBar;&lt;br /&gt;
[SerializeField] private Material materialBaz;&lt;br /&gt;
&lt;br /&gt;
[Header(&amp;quot;Transforms&amp;quot;)]&lt;br /&gt;
[Tooltip(&amp;quot;This tooltip appears when hovering your mouse over transformFoo in the inspector.&amp;quot;)]&lt;br /&gt;
[SerializeField] private Transform transformFoo;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Networking =&lt;br /&gt;
This section contains some tips related to networking and synchronizing changes between players.&lt;br /&gt;
&lt;br /&gt;
=== Call &amp;lt;code&amp;gt;OnDeserialization&amp;lt;/code&amp;gt; locally ===&lt;br /&gt;
When the networking owner of an UdonBehaviour uses &amp;lt;code&amp;gt;RequestSerialization()&amp;lt;/code&amp;gt;, all players &#039;&#039;&#039;except&#039;&#039;&#039; the owner execute &amp;lt;code&amp;gt;OnDeserialization()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
But if you override &amp;lt;code&amp;gt;OnDeserialization()&amp;lt;/code&amp;gt; in your script, the owner can manually execute it. This is useful if you&#039;d like the owner of the script to execute &amp;lt;code&amp;gt;OnDeserialization()&amp;lt;/code&amp;gt;, to replicate the same behaviour as other players.&lt;br /&gt;
&lt;br /&gt;
For example, here is a simple script that the master can use to increase a &amp;lt;code&amp;gt;score&amp;lt;/code&amp;gt; variable. The &amp;lt;code&amp;gt;scoreText&amp;lt;/code&amp;gt; is updated for everyone in &amp;lt;code&amp;gt;OnDeserialization&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;[UdonSynced] private int score;&lt;br /&gt;
[SerializeField] private TextMeshProUGUI scoreText;&lt;br /&gt;
&lt;br /&gt;
// The owner can call IncreaseScore anywhere to increase the score by 1.&lt;br /&gt;
public void IncreaseScore()&lt;br /&gt;
{&lt;br /&gt;
  score++;&lt;br /&gt;
  RequestSerialization();&lt;br /&gt;
  OnDeserialization();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public override void OnDeserialization()&lt;br /&gt;
{&lt;br /&gt;
  scoreText.text = score.ToString();&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;Note that &amp;lt;code&amp;gt;OnDeserialization()&amp;lt;/code&amp;gt; &#039;&#039;without&#039;&#039; parameters is a deprecated method. More complex scripts may require the overload &amp;lt;code&amp;gt;OnDeserialization(DeserializationResult)&amp;lt;/code&amp;gt;, and executing the overload locally may not make sense for the owner. Instead, consider writing your own method (e.g., &amp;lt;code&amp;gt;UpdateScoreText()&amp;lt;/code&amp;gt;, and calling it from &amp;lt;code&amp;gt;OnDeserialization()&amp;lt;/code&amp;gt; &#039;&#039;and&#039;&#039; manually calling it for the owner immediately after &amp;lt;code&amp;gt;RequestSerialization()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;⚠️This section is incomplete! Two sections have not been transferred from VRCLibrary yet.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Optimization ==&lt;br /&gt;
These tips can help reduce the CPU utilization causing by your scripts.&lt;br /&gt;
&lt;br /&gt;
=== Cache LocalPlayer ===&lt;br /&gt;
Cache &amp;lt;code&amp;gt;Networking.LocalPlayer&amp;lt;/code&amp;gt; by saving it as a local variable. Re-use the variable instead of calling &amp;lt;code&amp;gt;Networking.LocalPlayer&amp;lt;/code&amp;gt; again. For example:&amp;lt;syntaxhighlight lang=&amp;quot;c#&amp;quot;&amp;gt;&lt;br /&gt;
private VRCPlayerApi localPlayer;&lt;br /&gt;
&lt;br /&gt;
private void Start()&lt;br /&gt;
{&lt;br /&gt;
  localPlayer = Networking.LocalPlayer;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
private void Update()&lt;br /&gt;
{&lt;br /&gt;
  Debug.Log(localPlayer.GetPosition());&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;This &#039;&#039;slightly&#039;&#039; improves the performance of your behaviour, especially if you reference the local player one or more times per update.&lt;/div&gt;</summary>
		<author><name>Usr 923acdda-9202-4f4d-91c0-d0d7269c96a5</name></author>
	</entry>
	<entry>
		<id>https://wiki.vrchat.com/index.php?title=User:Usr_923acdda-9202-4f4d-91c0-d0d7269c96a5&amp;diff=71929</id>
		<title>User:Usr 923acdda-9202-4f4d-91c0-d0d7269c96a5</title>
		<link rel="alternate" type="text/html" href="https://wiki.vrchat.com/index.php?title=User:Usr_923acdda-9202-4f4d-91c0-d0d7269c96a5&amp;diff=71929"/>
		<updated>2026-05-02T17:03:40Z</updated>

		<summary type="html">&lt;p&gt;Usr 923acdda-9202-4f4d-91c0-d0d7269c96a5: Created page with &amp;quot;{{DISPLAYTITLE:User: Faxmashine}}  Hi!&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:User: Faxmashine}}&lt;br /&gt;
&lt;br /&gt;
Hi!&lt;/div&gt;</summary>
		<author><name>Usr 923acdda-9202-4f4d-91c0-d0d7269c96a5</name></author>
	</entry>
	<entry>
		<id>https://wiki.vrchat.com/index.php?title=Creator_Economy&amp;diff=26210</id>
		<title>Creator Economy</title>
		<link rel="alternate" type="text/html" href="https://wiki.vrchat.com/index.php?title=Creator_Economy&amp;diff=26210"/>
		<updated>2025-03-11T14:06:55Z</updated>

		<summary type="html">&lt;p&gt;Usr 923acdda-9202-4f4d-91c0-d0d7269c96a5: Corrects the release date of the Creator Economy. Adds a citation for the release dates. Updates the application URL to use the new application form. Adds comment about criteria being incomplete.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Noticebox/Official}}&lt;br /&gt;
VRChat&#039;s Creator Economy is a service introduced to VRChat offering users to purchase “VRChat Credits” to support their favorite creators. Creators may also set up a store, if they apply to the Creator Economy Program, and are accepted. All transactions are powered by VRChat&#039;s partner, [https://www.tilia.io/ Tilia].&lt;br /&gt;
&lt;br /&gt;
This service was teased during VRChat&#039;s [https://youtu.be/QBQnCxtDaso?t=5563 Developer Steam] in April 2021, and its initial testing period was launched to [[Special:MyLanguage/Open Beta|Open Beta]] starting on November 22nd, 2023 and finally released publicly on November 30, 2023&amp;lt;ref&amp;gt;[https://docs.vrchat.com/docs/vrchat-202342 VRChat Release 2023.4.2] from November 30, 2023.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==VRChat Credits==&lt;br /&gt;
{{credits}} VRChat Credits &#039;&#039;(symbolized by a &#039;&#039;&#039;\V&#039;&#039;&#039; symbol in plaintext)&#039;&#039;, VRC Credits, or simply &#039;&#039;&#039;&#039;credits&#039;&#039;&#039;&amp;lt;nowiki/&amp;gt;&#039;, are digital currency offered to VRChat users to exchange with other VRChat creators for perks. VRChat Credits can be purchased through the Steam Store, Meta Store, or Google Play Store.&lt;br /&gt;
&lt;br /&gt;
=== Purchasing===&lt;br /&gt;
[[File:Purchasingscreen.png|thumb|316x316px|VRChat Credits Menu (USD)]]&lt;br /&gt;
A user can purchase VRChat Credits by opening up their [[Special:MyLanguage/Main Menu|Main Menu]], going to the &#039;&#039;&#039;Marketplace&#039;&#039;&#039; tab, and then proceeding to the &#039;&#039;&#039;Wallet&#039;&#039;&#039; section. Or, by simply clicking the &#039;&#039;&#039;Wallet&#039;&#039;&#039; button in the top right of the Quick Menu or Main Menu.&lt;br /&gt;
&lt;br /&gt;
There are 5 different VRChat Credits Bundles that can be purchased, ranging from {{credits}}600 to {{credits}}12,000. From there, the user must have sufficient funds available to use on the Steam Store, or Meta Store, depending on where the credits are being purchased from. After completing the transaction, credits will immediately be applied to your account.&lt;br /&gt;
&lt;br /&gt;
====VRChat Credits Bundles ====&lt;br /&gt;
&amp;lt;!-- This is stupid. I think we should only have USD displayed. Having every currency exchange rate is not practical. --&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
!{{credits}} VRChat Credits &lt;br /&gt;
!Value&lt;br /&gt;
($USD)&lt;br /&gt;
!Value&lt;br /&gt;
(€Euro)&amp;lt;small&amp;gt;*&amp;lt;/small&amp;gt;&lt;br /&gt;
!Value&lt;br /&gt;
(¥JPY)&lt;br /&gt;
!Value&lt;br /&gt;
(¥CNY)&lt;br /&gt;
|-&lt;br /&gt;
|600&lt;br /&gt;
|4.99&lt;br /&gt;
|5.75 (Meta) / 5.46 (Steam)&lt;br /&gt;
|841 (Meta) / 810 (Steam)&lt;br /&gt;
|35.29 (Steam)&lt;br /&gt;
|-&lt;br /&gt;
|1,200&lt;br /&gt;
|9.99&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|2,400&lt;br /&gt;
|19.99&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|6,000&lt;br /&gt;
| 49.99&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|12,000&lt;br /&gt;
|99.99&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&#039;&#039;*Purchasing credits may include Value-Added Tax (VAT)&amp;lt;ref&amp;gt;{{VRC link|https://hello.vrchat.com/blog/euro-price-vat-change |European Pricing Update for VRChat Plus/Credits}} from 24 May, 2024&amp;lt;/ref&amp;gt;&#039;&#039;&lt;br /&gt;
===Spending === &lt;br /&gt;
Users can spend their VRChat Credits on the {{VRC link|https://vrchat.com/home/marketplace/welcome |website}}, or in the client, through either, [[Special:MyLanguage/Groups|group]] stores or [[Special:MyLanguage/Worlds|world]] stores. Users can buy a listing or a subscription with their VRChat Credits, each listing and subscription has products attached to them, these are &#039;&#039;in layman&#039;s terms&#039;&#039; the benefits you receive from the listing or subscription. &lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;Spotlight&#039;&#039;&#039; section of the Marketplace tab offers suggestions of worlds and groups that are currently enrolled in the Creator Economy Program.&lt;br /&gt;
&lt;br /&gt;
For more creator-related information, see the Creator Economy documentation.&amp;lt;ref&amp;gt;{{VRC link|https://creators.vrchat.com/economy/ |Creator Economy Documentation}} from 24 May, 2024&amp;lt;/ref&amp;gt;&#039;&#039;.&#039;&#039;&lt;br /&gt;
==== Listings====&lt;br /&gt;
Listings are what users can buy from world stores. While listings can be anything the world creator decides, users can expect to see common types of listing such as: Unlocking new areas of a world, customization options, and more.&lt;br /&gt;
&lt;br /&gt;
There are 3 types of listings world creators can offer, each type has a different duration type.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Listing&lt;br /&gt;
!Duration &lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|Instant&lt;br /&gt;
&lt;br /&gt;
|None&lt;br /&gt;
|Users can purchase this type as many times as they want. Benefits are instantly awarded. This type is only purchasable if you are in the world. &lt;br /&gt;
|-&lt;br /&gt;
| Temporary&lt;br /&gt;
| 5 minutes - 3 months &lt;br /&gt;
|Users can purchase this type as many times as they want &#039;&#039;&#039;but&#039;&#039;&#039; can&#039;t repurchase until its duration expires. Benefits earned are only available until its duration expires. &lt;br /&gt;
|-&lt;br /&gt;
|Permanent&lt;br /&gt;
|Unlimited&lt;br /&gt;
|Users can only purchase this type once. Benefits are permanently available to the buyer.&lt;br /&gt;
|}&lt;br /&gt;
====Subscriptions====&lt;br /&gt;
Subscriptions are what users can buy from group stores. While listings can be anything the world creator decides, users can expect to see common types of listing such as: VIP access.&lt;br /&gt;
&lt;br /&gt;
Users have 4 default duration options, they can choose from when buying a subscription.  &lt;br /&gt;
&lt;br /&gt;
*1 month&lt;br /&gt;
*3 months&lt;br /&gt;
* 6 months&lt;br /&gt;
*12 months&lt;br /&gt;
&lt;br /&gt;
There is also a custom duration option users can choose, which ranges from 1 month to 99 months. Subscriptions do not automatically renew.&lt;br /&gt;
&lt;br /&gt;
When a user buys a subscription, they will be automatically added to the group they bought the subscription from. Buyers will also a group role, which creators can offer group specific benefits. &lt;br /&gt;
=== Viewing transaction history===&lt;br /&gt;
To view the history of your transactions, navigate to the &#039;&#039;&#039;Marketplace&#039;&#039;&#039; page on the [[Special:MyLanguage/Main Menu|Main Menu]], proceed to the &#039;&#039;&#039;Wallet&#039;&#039;&#039; section, and then choose the &#039;&#039;&#039;Transactions&#039;&#039;&#039; tab. Alternatively, you can view it on the {{VRC link|https://vrchat.com/home/marketplace/wallet |VRChat website}}. &lt;br /&gt;
&lt;br /&gt;
The Transactions tab shows the history of the user&#039;s VRChat Credits on their account. Listing the name of the product, the amount of credits, the remaining balance after the purchase, the recipient, the date of purchase, and the type of transaction.&lt;br /&gt;
&lt;br /&gt;
To view your purchases or active and expired subscriptions, navigate to the &#039;&#039;&#039;Purchases &amp;amp; Subscriptions&#039;&#039;&#039; tab of the &#039;&#039;&#039;Marketplace&#039;&#039;&#039; page.  &lt;br /&gt;
&lt;br /&gt;
The Purchases tab lists any listing you bought, including its type, date of purchase and expiration, and details. While, the Subscriptions tab includes the same details as the Purchases tab, just instead for subscriptions. It is split up by an &amp;quot;Active&amp;quot; and &amp;quot;Expired&amp;quot; dropdown, and also includes an option to renew the subscription or cancel it. &lt;br /&gt;
&lt;br /&gt;
==Enrolling in the Creator Economy Program ==&lt;br /&gt;
To be able to enroll in the Creator Economy Program, a user must have uploaded content and have access to the VRChat Creator Companion, and then [https://www.surveymonkey.com/r/vrc-econ-apply apply to become a seller], as long as they are eligible:&lt;br /&gt;
&lt;br /&gt;
====Eligibility&amp;lt;!-- Incomplete. The CE has additional eligibility criteria, listed in the application form: https://www.surveymonkey.com/r/vrc-econ-apply --&amp;gt;====  &lt;br /&gt;
&lt;br /&gt;
*Be a User who is 18 years of age or older.&lt;br /&gt;
*Have a VRChat account that has been active for at least 30 days.&lt;br /&gt;
*Have a current and active subscription to VRChat Plus.&lt;br /&gt;
*Have a verified email address associated with your Account.&lt;br /&gt;
*Be a community member in good standing at all times while using the Platform, with no suspensions or bans from the Platform or the VRC Creator Economy in the last 90 days.&lt;br /&gt;
* Use the Platform in strict compliance with CE Rules, the Terms, the Community Guidelines, and the requirements set out in &#039;&#039;Creator Economy Program Rules Section 5&#039;&#039;.&lt;br /&gt;
*Not engage in any of the following activities: scamming, phishing, false advertising, attempting to exchange Credits for real currency other than through the Platform, or any illegal or unethical activities.&lt;br /&gt;
* Meet any other eligibility requirements that we or our CE Partner may establish from time to time in our or their sole discretion, including but not limited to: &lt;br /&gt;
**Having all applicable tax forms on file with the relevant CE Partner&lt;br /&gt;
**Completing any applicable CE Partner’s Know Your Customer registration, as required by such CE Partner&lt;br /&gt;
{{VRC link|https://hello.vrchat.com/legal/economy |See here}} to view the full Creator Economy Program Rules.&lt;br /&gt;
&lt;br /&gt;
==Resources== &lt;br /&gt;
*{{VRC link|https://creators.vrchat.com/economy/ |&amp;quot;Resources for Creator Economy&amp;quot;}} at &#039;&#039;creators.vrchat.com&#039;&#039;&lt;br /&gt;
*{{VRC link|https://hello.vrchat.com/blog/creator-economy |&amp;quot;Introducing the Creator Economy!&amp;quot;}} at &#039;&#039;hello.vrchat.com&#039;&#039;&lt;br /&gt;
*{{VRC link|https://hello.vrchat.com/blog/paid-subscriptions-beta |&amp;quot;Paid Subscriptions Beta&amp;quot;}} at &#039;&#039;hello.vrchat.com&#039;&#039;&lt;br /&gt;
*[https://www.tilia.io/ Tilia&#039;s website] at &#039;&#039;tilia.io&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==References==&lt;br /&gt;
{{Reflist}}&lt;/div&gt;</summary>
		<author><name>Usr 923acdda-9202-4f4d-91c0-d0d7269c96a5</name></author>
	</entry>
</feed>