{"componentChunkName":"component---src-templates-blog-post-js","path":"/udonsharp1/","result":{"data":{"site":{"siteMetadata":{"title":"/dev/yukarinoki"}},"markdownRemark":{"id":"220ed98e-d18b-5d63-916e-548fd2c14353","excerpt":"概要 近年メタバースの筆頭として注目されているVRChatでは、各ユーザーがワールドを自作することができます。単に建物や景観を作成するだけなら3DCGスキルで十分ですが、ユーザーの挙動に応じてワールドが変化するようなギミックを作るにはUdonを用いたプログラミングが必要になります。UdonはVRChat…","html":"<h1 id=\"概要\" style=\"position:relative;\"><a href=\"#%E6%A6%82%E8%A6%81\" aria-label=\"概要 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>概要</h1>\n<p>近年メタバースの筆頭として注目されているVRChatでは、各ユーザーがワールドを自作することができます。単に建物や景観を作成するだけなら3DCGスキルで十分ですが、ユーザーの挙動に応じてワールドが変化するようなギミックを作るにはUdonを用いたプログラミングが必要になります。UdonはVRChat上で独自のギミックを作成するためのツールとしてはほとんど唯一の選択肢になっています。</p>\n<p>Udonを最も簡易的に利用する方法はUdon Graphを用いた方法であり、この方法についての解説記事がネット上で大半を占めています。しかし、一定以上に複雑なギミックを作成する場合には、Udon Graphを用いた手法は複雑度・実装速度の面から見て現実的ではありません。例えば、大人気World AmongUsVRには、AmongUsのほぼすべての機能が実装されていますが、これをUdon Graphを用いてプログラムすることは不可能だろうと容易に想像出来ると思います。そのため、Udonを直接C#でコーディングできるUdonSharpを利用する方法が重要になります。</p>\n<p>本稿は、Udon Sharpを用いたC#によるプログラミングの方法を、Udon Graphによる実装と対応させながら解説することで、現在Udon Graphを使用しているユーザーがC#実装に一歩踏み出すための手助けになることを目指しました。</p>\n<h1 id=\"事前知識\" style=\"position:relative;\"><a href=\"#%E4%BA%8B%E5%89%8D%E7%9F%A5%E8%AD%98\" aria-label=\"事前知識 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>事前知識</h1>\n<p>VRChatのワールド作成、Udon Graphによるプログラミングについての知識を仮定します。\n具体的には、</p>\n<h3 id=\"vrchatワールド作成\" style=\"position:relative;\"><a href=\"#vrchat%E3%83%AF%E3%83%BC%E3%83%AB%E3%83%89%E4%BD%9C%E6%88%90\" aria-label=\"vrchatワールド作成 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>VRChatワールド作成</h3>\n<ul>\n<li>おくらすVRちゃんねる氏のワールド作成動画　再生リスト<br>\n<a href=\"https://www.youtube.com/watch?v=_0vgPjV4YZk&#x26;list=PLdywIhUp6C4o_mNKGedMFRlbckXWv_UpD\">https://www.youtube.com/watch?v=_0vgPjV4YZk&#x26;list=PLdywIhUp6C4o_mNKGedMFRlbckXWv_UpD</a></li>\n</ul>\n<h3 id=\"udon-graphによるプログラミング\" style=\"position:relative;\"><a href=\"#udon-graph%E3%81%AB%E3%82%88%E3%82%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0\" aria-label=\"udon graphによるプログラミング permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Udon Graphによるプログラミング</h3>\n<ul>\n<li>Udon のはじめかた　(toe氏)<br>\n<a href=\"https://note.com/toh_csecb/n/nc57eb0e73d27\">https://note.com/toh_csecb/n/nc57eb0e73d27</a>  </li>\n<li>VRCワールドのSDK3 UDON(graphのほう)でミラーをオンする (かくちゅ氏)<br>\n<a href=\"https://note.com/kakutyu50/n/nc8bbe6cfc1c2\">https://note.com/kakutyu50/n/nc8bbe6cfc1c2</a></li>\n<li>sdk3のudonでミラーをオンオフする(ついでに同期させる)  (かくちゅ氏)<br>\n<a href=\"https://note.com/kakutyu50/n/n12052eba0b39\">https://note.com/kakutyu50/n/n12052eba0b39</a></li>\n</ul>\n<p>以上すべてを実際に手を動かしてやって頂ければ、本稿を読むうえで必要十分の知識が得られます。</p>\n<h1 id=\"事前準備\" style=\"position:relative;\"><a href=\"#%E4%BA%8B%E5%89%8D%E6%BA%96%E5%82%99\" aria-label=\"事前準備 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>事前準備</h1>\n<p>本稿は「sdk3のudonでミラーをオンオフする(ついでに同期させる)」で作成したミラースイッチ実装を出発点とするので、それが実装された状態にしてください。<br>\nあと、C#によるコーディングにはUdon Sharpが必要なので、以下からパッケージをDownload &#x26; Importしてください。</p>\n<ul>\n<li>Udon Sharp/release<br>\n<a href=\"https://github.com/MerlinVR/UdonSharp/releases\">https://github.com/MerlinVR/UdonSharp/releases</a> </li>\n</ul>\n<p>あと、必須かわからないのですが、Visual Studioをインストールしておいてください。</p>\n<h1 id=\"1-cコードを動かすまで\" style=\"position:relative;\"><a href=\"#1-c%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E5%8B%95%E3%81%8B%E3%81%99%E3%81%BE%E3%81%A7\" aria-label=\"1 cコードを動かすまで permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>1. C#コードを動かすまで</h1>\n<h2 id=\"出発点\" style=\"position:relative;\"><a href=\"#%E5%87%BA%E7%99%BA%E7%82%B9\" aria-label=\"出発点 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>出発点</h2>\n<p>「sdk3のudonでミラーをオンオフする(ついでに同期させる)」でミラースイッチ実装を作成していると、以下のようなオブジェクトとそれに付与されたUdon Graphがあるはずです。（僕の実装では、ユーザーがそのワールドにJoinした時の処理も追加してあります。画像はクリックで拡大してください。）</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/6487a2eb7c14648ae286f003ba1c1732/91e7e/asset_position.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 108.1081081081081%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAWCAYAAADAQbwGAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAD2UlEQVQ4y12T6XLiVhCF9QSpJBMW7RJCgCRWIXZkwDZ4sI3xMuOZmqnk/d/i5PSVTKby46uWVPee7tPd0vLlDPliim2+wO12jc16jvVignw5LZkprshylmGWjTAlk/EQk3SILB1gPOojHfYxGvSgyaHD9RXeXx7w/e2EL+cjPt9ulLCIXK1mTDDFaj5RgovpGLNJiikFsxHFKJRSaNTvYtBLoMnl768n/P3tBT+/PuPH1zPFH3F/2KmqpcrVPMOcIlKdMLlURaFBITToxQrt6bjH29PxwsvjHZ4fDnj8fIPb3boUG6mKfhUUux+iw/6HKCuUi+f7PZ4pdH7YkwOe+H7i9+N+p/oqPRQhsSj2/rMYX+h3Y/SSCNpxv6W9azzcXSubgggKdzcbCg2R9mPVR+mfVFdYLUSFYb+wrAT31zmHkmO/y8vGj5VlsS/tuN2uMIhDpL2ILcjVkGQQcrkXdxRx1EIStRG1Q2hbTnN3tcSOA5B+SV8WM5mk9KrP96LxUbuJuBOiG7dpL8LhZqvoJZ2LXRHVZD1kmtv1QjU+HXZxw6oESbRZzVVlc1pPOk3aTlXSf3684/X8iIQVdkuiTqvYw2LPih273qzVXkr/brc5xIG8i5Akf326V4JyLktHrLpV0kanRcvSN/kzpHerxQz7m50SkZ4uKTJI2qodso/iZJMv1UAGtClV9cuYfFQoVUmVYjdsuGi1mvy1UvYxU4dbYYA5z0iP4qhD0ZVam1/7JkJCO2xKhRmWMt1sgEVkYNDxkIQu4pJO4KDdcBCFHrJhgikHJQusqoraZYWRQllW/yS3fjHu4WnqERdnFT2cJh4eyXHs4D7j89THIQu4e8mlQiWeRCqBqrD4LweYp108zzyKuYwu3hYevi59vK98/Nw0GRt45/tp1lBro/YwKaYbl5abgQ+tw55F3K9Y9qxhoEv6gY5hs45J28TdtIXXPMZbHuHbJsJp0VZWRURi0cdiIA3fg+Y6Nj5wiG1bsCwLpmnCZHQcV+F5Hnwil4IGKWOrGVzwPRda4BpouCZ80vAsRhsecd2PJBS1TSYilmDAMgVdYRp1oisMPmueWUWDhE6d1BDaFbQYW65QR8Dvvq3Dsw04FFOCFLYYTbPEMChGQZ2Cdd2mNZcfbNTrJnSdF3jA4QHXpJhZY8IKmlYVAaNv/Ek+8ftfpAKPODxj86wSdB2fdlxmchRGic4ENd1CrW6hykR1xkpVR7VSQ61ShV6twqhVYNY+wa39gVD/DaHxOzTb9mBR0LIKlCjFDMP6H3TABJLM4h3HDeD5LfhBB0GYIOJSz9tV/Av21qYJghAmfQAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"object\"\n        title=\"object\"\n        src=\"/static/6487a2eb7c14648ae286f003ba1c1732/fcda8/asset_position.png\"\n        srcset=\"/static/6487a2eb7c14648ae286f003ba1c1732/12f09/asset_position.png 148w,\n/static/6487a2eb7c14648ae286f003ba1c1732/e4a3f/asset_position.png 295w,\n/static/6487a2eb7c14648ae286f003ba1c1732/fcda8/asset_position.png 590w,\n/static/6487a2eb7c14648ae286f003ba1c1732/91e7e/asset_position.png 692w\"\n        sizes=\"(max-width: 590px) 100vw, 590px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n  </a>\n    </span>\n<span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/43a5509a66851a80fd1e267584ecfb7c/78958/udon_graph.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 57.432432432432435%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABp0lEQVQoz3VSyXajMBDkR5KJ2YzQAsKABy8YT2655pb//49KqTUQZ17m0DyqW6rurlJSVRW0qVGUGcqywPkyo2k7ONdgGAZorWGM+RZN06CuFS73V7y9f8C1LZSqmKuRhI+qK+RFjorJ8feE0KQsSx5ScujfCPkQmuTaaCFfa0LYenbUPGANrssrXNOS/GeyOMB34sfGSfzRApzv0PUD14pYMy8ra7Nd0CG0/sJabzgQJ2uhqvbw/cgV7FfXrbNiXYkMWZ5jt0ux31coigK7NBVcq0i+ESrqFgkN0owHdM1JLc2ivnmB0+mEy3WW6A4944DrvAj2XS8c1trHCSOhYTLo2XovLo/DiAMvH49Hkk44n88YKItzLjYh7lkPGznrIqFowEQgrDlhxgkLuh6eR16UMmHbek7vBD//2smzMrbhBns8Pb+IBJYbJYq7B13SLINtPA9pumwYFtM04dD38DQrTHO73XC//0HPyT03mOcZy7Jg5PSby+ISmbO8hOGDbv5OEkwIa60GBUnCBfPgqGATXV5xsooZIhQsdZB/Y/77qH965Cv+BPU4ThNZD8m4AAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"udon_graph\"\n        title=\"udon_graph\"\n        src=\"/static/43a5509a66851a80fd1e267584ecfb7c/fcda8/udon_graph.png\"\n        srcset=\"/static/43a5509a66851a80fd1e267584ecfb7c/12f09/udon_graph.png 148w,\n/static/43a5509a66851a80fd1e267584ecfb7c/e4a3f/udon_graph.png 295w,\n/static/43a5509a66851a80fd1e267584ecfb7c/fcda8/udon_graph.png 590w,\n/static/43a5509a66851a80fd1e267584ecfb7c/efc66/udon_graph.png 885w,\n/static/43a5509a66851a80fd1e267584ecfb7c/c83ae/udon_graph.png 1180w,\n/static/43a5509a66851a80fd1e267584ecfb7c/78958/udon_graph.png 1320w\"\n        sizes=\"(max-width: 590px) 100vw, 590px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n  </a>\n    </span></p>\n<p><em>このUdon graphと同様の処理を行うC#コードの実装について解説していきます。</em></p>\n<p>同じものを実装するので、このオブジェクトの隣に、同じような配置で鏡とスイッチのオブジェクトを作成してください。(1)</p>\n<h2 id=\"cでコーディングするモード\" style=\"position:relative;\"><a href=\"#c%E3%81%A7%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%99%E3%82%8B%E3%83%A2%E3%83%BC%E3%83%89\" aria-label=\"cでコーディングするモード permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>C#でコーディングするモード</h2>\n<p>スイッチのオブジェクトにUdon Behaviourを追加してください。New Programの下のドロップダウンから<code class=\"language-text\">Udon C# Programing Asset</code>を選択し、New Programをクリック、続けてCreate Scriptもクリックしてください。すると、ファイルを保存するディレクトリを聞かれるので、どこでもいいので保存してください（僕は<code class=\"language-text\">プロジェクト直下/Assets/yukarinoki/interactive_mirror</code>というディレクトリに設定しました）。保存すると、おそらくVisual Studioが開くと思います。開いたら右側のソリューションエクスプローラーの一番上から、Assembly-Csharpを開いて自分が先ほど保存したファイル開いてください。（僕の環境では以下の場所にあります。）</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 306px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/106c8479e71532142f767f3b48a2206d/98b92/direc.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 227.02702702702703%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,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'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"direc\"\n        title=\"direc\"\n        src=\"/static/106c8479e71532142f767f3b48a2206d/98b92/direc.png\"\n        srcset=\"/static/106c8479e71532142f767f3b48a2206d/12f09/direc.png 148w,\n/static/106c8479e71532142f767f3b48a2206d/e4a3f/direc.png 295w,\n/static/106c8479e71532142f767f3b48a2206d/98b92/direc.png 306w\"\n        sizes=\"(max-width: 306px) 100vw, 306px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n  </a>\n    </span></p>\n<p>すると左側に以下のコードが現れると思います。</p>\n<div class=\"gatsby-highlight\" data-language=\"csharp\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-csharp line-numbers\"><code class=\"language-csharp\"><span class=\"token keyword\">using</span> <span class=\"token namespace\">UdonSharp</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">using</span> <span class=\"token namespace\">UnityEngine</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">using</span> <span class=\"token namespace\">VRC<span class=\"token punctuation\">.</span>SDKBase</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">using</span> <span class=\"token namespace\">VRC<span class=\"token punctuation\">.</span>Udon</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">mirror_switch</span> <span class=\"token punctuation\">:</span> <span class=\"token type-list\"><span class=\"token class-name\">UdonSharpBehaviour</span></span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token return-type class-name\"><span class=\"token keyword\">void</span></span> <span class=\"token function\">Start</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        \n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<h2 id=\"鏡スイッチのcコード\" style=\"position:relative;\"><a href=\"#%E9%8F%A1%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81%E3%81%AEc%E3%82%B3%E3%83%BC%E3%83%89\" aria-label=\"鏡スイッチのcコード permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>鏡スイッチのC#コード</h2>\n<p>上のコード削除して、以下のコードを貼り付けてください。ただ、mirror_switchの部分は自分のオブジェクト名にしてください。</p>\n<div class=\"gatsby-highlight\" data-language=\"csharp\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-csharp line-numbers\"><code class=\"language-csharp\"><span class=\"token keyword\">using</span> <span class=\"token namespace\">UdonSharp</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">using</span> <span class=\"token namespace\">UnityEngine</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">using</span> <span class=\"token namespace\">VRC<span class=\"token punctuation\">.</span>SDKBase</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">using</span> <span class=\"token namespace\">VRC<span class=\"token punctuation\">.</span>Udon</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">using</span> <span class=\"token namespace\">UnityEngine<span class=\"token punctuation\">.</span>UI</span><span class=\"token punctuation\">;</span>\n\n\n\n<span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">mirror_switch</span> <span class=\"token punctuation\">:</span> <span class=\"token type-list\"><span class=\"token class-name\">UdonSharpBehaviour</span></span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token punctuation\">[</span><span class=\"token attribute\"><span class=\"token class-name\">SerializeField</span></span><span class=\"token punctuation\">]</span> <span class=\"token keyword\">private</span> <span class=\"token class-name\">GameObject</span> mirror<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\"><span class=\"token keyword\">bool</span></span> is_active <span class=\"token operator\">=</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">override</span> <span class=\"token return-type class-name\"><span class=\"token keyword\">void</span></span> <span class=\"token function\">Interact</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        Debug<span class=\"token punctuation\">.</span><span class=\"token function\">Log</span><span class=\"token punctuation\">(</span>is_active<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>is_active<span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">{</span>\n            <span class=\"token function\">SendCustomNetworkEvent</span><span class=\"token punctuation\">(</span>VRC<span class=\"token punctuation\">.</span>Udon<span class=\"token punctuation\">.</span>Common<span class=\"token punctuation\">.</span>Interfaces<span class=\"token punctuation\">.</span>NetworkEventTarget<span class=\"token punctuation\">.</span>All<span class=\"token punctuation\">,</span> <span class=\"token string\">\"MirrorOff\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n        <span class=\"token keyword\">else</span>\n        <span class=\"token punctuation\">{</span>\n            <span class=\"token function\">SendCustomNetworkEvent</span><span class=\"token punctuation\">(</span>VRC<span class=\"token punctuation\">.</span>Udon<span class=\"token punctuation\">.</span>Common<span class=\"token punctuation\">.</span>Interfaces<span class=\"token punctuation\">.</span>NetworkEventTarget<span class=\"token punctuation\">.</span>All<span class=\"token punctuation\">,</span> <span class=\"token string\">\"MirrorOn\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token return-type class-name\"><span class=\"token keyword\">void</span></span> <span class=\"token function\">MirrorOn</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        mirror<span class=\"token punctuation\">.</span><span class=\"token function\">SetActive</span><span class=\"token punctuation\">(</span><span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        is_active <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">public</span> <span class=\"token return-type class-name\"><span class=\"token keyword\">void</span></span> <span class=\"token function\">MirrorOff</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        mirror<span class=\"token punctuation\">.</span><span class=\"token function\">SetActive</span><span class=\"token punctuation\">(</span><span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        is_active <span class=\"token operator\">=</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">public</span> <span class=\"token keyword\">override</span> <span class=\"token return-type class-name\"><span class=\"token keyword\">void</span></span> <span class=\"token function\">OnPlayerJoined</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">VRCPlayerApi</span> player<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>is_active<span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">{</span>\n            <span class=\"token function\">SendCustomEvent</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"MirrorOn\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n        <span class=\"token keyword\">else</span>\n        <span class=\"token punctuation\">{</span>\n            <span class=\"token function\">SendCustomEvent</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"MirrorOff\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<h2 id=\"コンパイル--オブジェクト設定\" style=\"position:relative;\"><a href=\"#%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB--%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E8%A8%AD%E5%AE%9A\" aria-label=\"コンパイル  オブジェクト設定 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>コンパイル &#x26; オブジェクト設定</h2>\n<p>Unityに戻り、スイッチオブジェクトのUdon BehaviourのCompile All UdonSharpo Programsをクリックしてください。すると、UtilitiesのところにMirrorというオブジェクト設定項目で出ていると思います。ここにVRCMirrorのオブジェクトを設定してください。\n<span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 521px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/da4a464de19232bb980441c651fab6ca/bb9c5/udonbehavior.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 50%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAA7DAAAOwwHHb6hkAAABRUlEQVQoz3WS666CMBCE+0KoUeQqCMgdlUCI+v4vsp5vk54QEn9Mtt1Op7O7NdM8yTiNUte1zPMsz+dT7ve7jOMobdtKFEdyuVx+Io5jKctSuq6T6/Uqxvd8SZJEweH5fJbj8Siu6+o6iELxfF/Xnudp/nQ66Z613QP/j2cQud1u6rBpGo28GIahEvq+k2ma5PF4SFEUkqapOtkiyzK9ZyAMw6BCCFNGFEUqhqM8z1UIWPe4Ia5xOBxkv9+LQaDvexVEnNLJ2TbQm6qqVBBxOFvA43GEDXYplcjBmkQ7EMe5FbQ5+6CFvWOonR4xWdzglsi0P5+PvF4vxfv91khuWRblrUHbMPY/FMqiqawBawgQAQ8CvhJntq9r6LfBpu0Rie0fC4JAJ06kTwzGfqEtGKYOBTGmCri4BkSEOXMc5yd2u50KfgEp+1peLqf9CwAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"udonbehavior\"\n        title=\"udonbehavior\"\n        src=\"/static/da4a464de19232bb980441c651fab6ca/bb9c5/udonbehavior.png\"\n        srcset=\"/static/da4a464de19232bb980441c651fab6ca/12f09/udonbehavior.png 148w,\n/static/da4a464de19232bb980441c651fab6ca/e4a3f/udonbehavior.png 295w,\n/static/da4a464de19232bb980441c651fab6ca/bb9c5/udonbehavior.png 521w\"\n        sizes=\"(max-width: 521px) 100vw, 521px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n  </a>\n    </span></p>\n<h2 id=\"動作確認\" style=\"position:relative;\"><a href=\"#%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8D\" aria-label=\"動作確認 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>動作確認</h2>\n<p>VRshat SDKからBuildテストをしてみてください。Udon Graphと同様にスイッチで動作することが確認できると思います。</p>\n<h1 id=\"2-コード解説\" style=\"position:relative;\"><a href=\"#2-%E3%82%B3%E3%83%BC%E3%83%89%E8%A7%A3%E8%AA%AC\" aria-label=\"2 コード解説 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>2. コード解説</h1>\n<h2 id=\"他オブジェクトの利用\" style=\"position:relative;\"><a href=\"#%E4%BB%96%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E5%88%A9%E7%94%A8\" aria-label=\"他オブジェクトの利用 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>他オブジェクトの利用</h2>\n<p>以下の部分が、そのコードが使用する他オブジェクトの宣言になります。ここに宣言されるとコンパイル時にUdon Sharpが読み取り、変数名(mirror)と同名のオブジェクト設定項目(Mirror)が出てくるようになっています。先頭が大文字になるのは仕様です。</p>\n<div class=\"gatsby-highlight\" data-language=\"csharp\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-csharp line-numbers\"><code class=\"language-csharp\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">mirror_switch</span> <span class=\"token punctuation\">:</span> <span class=\"token type-list\"><span class=\"token class-name\">UdonSharpBehaviour</span></span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token punctuation\">[</span><span class=\"token attribute\"><span class=\"token class-name\">SerializeField</span></span><span class=\"token punctuation\">]</span> <span class=\"token keyword\">private</span> <span class=\"token class-name\">GameObject</span> mirror<span class=\"token punctuation\">;</span> <span class=\"token comment\">/*ここを見てUdonは対象オブジェクトを判断*/</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\"><span class=\"token keyword\">bool</span></span> is_active <span class=\"token operator\">=</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>試しに、以下のように変更してコンパイルしてみましょう。すると、Sizeというパラメータを含んだ設定が出てきますね。複数同じようなオブジェクトを管理したいときには配列を使うのが便利です。</p>\n<div class=\"gatsby-highlight\" data-language=\"csharp\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-csharp line-numbers\"><code class=\"language-csharp\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">mirror_switch</span> <span class=\"token punctuation\">:</span> <span class=\"token type-list\"><span class=\"token class-name\">UdonSharpBehaviour</span></span>\n<span class=\"token punctuation\">{</span>\n    <span class=\"token punctuation\">[</span><span class=\"token attribute\"><span class=\"token class-name\">SerializeField</span></span><span class=\"token punctuation\">]</span> <span class=\"token keyword\">private</span> <span class=\"token class-name\">GameObject</span> mirror<span class=\"token punctuation\">;</span> \n     <span class=\"token punctuation\">[</span><span class=\"token attribute\"><span class=\"token class-name\">SerializeField</span></span><span class=\"token punctuation\">]</span> <span class=\"token keyword\">private</span> <span class=\"token class-name\">GameObject<span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span></span> tekitou<span class=\"token punctuation\">;</span> <span class=\"token comment\">/*変更*/</span>\n\n    <span class=\"token keyword\">private</span> <span class=\"token class-name\"><span class=\"token keyword\">bool</span></span> is_active <span class=\"token operator\">=</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">;</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<h2 id=\"interact時の挙動の設定\" style=\"position:relative;\"><a href=\"#interact%E6%99%82%E3%81%AE%E6%8C%99%E5%8B%95%E3%81%AE%E8%A8%AD%E5%AE%9A\" aria-label=\"interact時の挙動の設定 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>　Interact時の挙動の設定</h2>\n<p>以下の部分がInteract時の挙動の設定コードです。</p>\n<div class=\"gatsby-highlight\" data-language=\"csharp\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-csharp line-numbers\"><code class=\"language-csharp\"> <span class=\"token keyword\">public</span> <span class=\"token keyword\">override</span> <span class=\"token return-type class-name\"><span class=\"token keyword\">void</span></span> <span class=\"token function\">Interact</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        Debug<span class=\"token punctuation\">.</span><span class=\"token function\">Log</span><span class=\"token punctuation\">(</span>is_active<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>is_active<span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">{</span>\n            <span class=\"token function\">SendCustomNetworkEvent</span><span class=\"token punctuation\">(</span>VRC<span class=\"token punctuation\">.</span>Udon<span class=\"token punctuation\">.</span>Common<span class=\"token punctuation\">.</span>Interfaces<span class=\"token punctuation\">.</span>NetworkEventTarget<span class=\"token punctuation\">.</span>All<span class=\"token punctuation\">,</span> <span class=\"token string\">\"MirrorOff\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n        <span class=\"token keyword\">else</span>\n        <span class=\"token punctuation\">{</span>\n            <span class=\"token function\">SendCustomNetworkEvent</span><span class=\"token punctuation\">(</span>VRC<span class=\"token punctuation\">.</span>Udon<span class=\"token punctuation\">.</span>Common<span class=\"token punctuation\">.</span>Interfaces<span class=\"token punctuation\">.</span>NetworkEventTarget<span class=\"token punctuation\">.</span>All<span class=\"token punctuation\">,</span> <span class=\"token string\">\"MirrorOn\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>overrideでUdonSharpBehaviour内のInteract()を上書きしています。  </p>\n<p>is_activeに応じて条件分岐した上で、SendCustomNetworkEvent()で全員を対象に”MirrorOff”か”MirrorOn”というCustomEventを発火させています。</p>\n<h3 id=\"デバッグ\" style=\"position:relative;\"><a href=\"#%E3%83%87%E3%83%90%E3%83%83%E3%82%B0\" aria-label=\"デバッグ permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>デバッグ</h3>\n<p>複雑なコードになると当然デバッグが必要になります。手軽なデバッグ方法として、ログ出力があります。それは以下の部分です。</p>\n<div class=\"gatsby-highlight\" data-language=\"csharp\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-csharp line-numbers\"><code class=\"language-csharp\">    <span class=\"token punctuation\">{</span>\n        Debug<span class=\"token punctuation\">.</span><span class=\"token function\">Log</span><span class=\"token punctuation\">(</span>is_active<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>　<span class=\"token comment\">// ここ</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>is_active<span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">{</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span></span></pre></div>\n<p>これで変数がログに出力されます。</p>\n<p>一体ログはどこでみるのかという話なんですが、VRChatを起動して、<code class=\"language-text\">右SHIFT + バッククウォート + 3</code> を押してみるとログが立ち上がります。（日本語キーボードなら、<code class=\"language-text\">右SHIFT + @ + 3</code>ということです。ログが開かない人はVRChat内の設定画面を開いてから同じキーを入力してみるとうまくいくかも？）\nこれで、スイッチにインタラクトすると以下のようなログ出力が確認できます。\n<span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/8d147aa3b6ea7325bdb109d34f8036f1/5a3c9/log.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 15.54054054054054%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAYAAACTWi8uAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAArElEQVQI1x3MXW6EIABFYVfRh6ZpRvwZGRBQEVHR6f43dcrw8OUk9+FWzXZSvyPKH9h44fY7N2Hy/tGZhd76Ylh2GrMiRp/r+ZWuqPXCQ818CUnVhA3x9szhYDtvYvojHBfrnvDxRJqpeNkFFxIvF+j1zHNcENIgBkOnJlrl+K57qi4fNrfHh0g8Enu6Std44LcdbafMoYxDjhO9MqUf7aBppWbQjqey/Dxa/gE/410/Mhg73AAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"log\"\n        title=\"log\"\n        src=\"/static/8d147aa3b6ea7325bdb109d34f8036f1/fcda8/log.png\"\n        srcset=\"/static/8d147aa3b6ea7325bdb109d34f8036f1/12f09/log.png 148w,\n/static/8d147aa3b6ea7325bdb109d34f8036f1/e4a3f/log.png 295w,\n/static/8d147aa3b6ea7325bdb109d34f8036f1/fcda8/log.png 590w,\n/static/8d147aa3b6ea7325bdb109d34f8036f1/efc66/log.png 885w,\n/static/8d147aa3b6ea7325bdb109d34f8036f1/5a3c9/log.png 1169w\"\n        sizes=\"(max-width: 590px) 100vw, 590px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n  </a>\n    </span></p>\n<h2 id=\"customeventに対応する挙動の設定\" style=\"position:relative;\"><a href=\"#customevent%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%99%E3%82%8B%E6%8C%99%E5%8B%95%E3%81%AE%E8%A8%AD%E5%AE%9A\" aria-label=\"customeventに対応する挙動の設定 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>CustomEventに対応する挙動の設定</h2>\n<p>CustomEventに対応するには、そのイベント名と同名の関数を宣言します。</p>\n<div class=\"gatsby-highlight\" data-language=\"csharp\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-csharp line-numbers\"><code class=\"language-csharp\">    <span class=\"token keyword\">public</span> <span class=\"token return-type class-name\"><span class=\"token keyword\">void</span></span> <span class=\"token function\">MirrorOn</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        mirror<span class=\"token punctuation\">.</span><span class=\"token function\">SetActive</span><span class=\"token punctuation\">(</span><span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        is_active <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">public</span> <span class=\"token return-type class-name\"><span class=\"token keyword\">void</span></span> <span class=\"token function\">MirrorOff</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        mirror<span class=\"token punctuation\">.</span><span class=\"token function\">SetActive</span><span class=\"token punctuation\">(</span><span class=\"token boolean\">false</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        is_active <span class=\"token operator\">=</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<p>オブジェクトの存在は.SetActive()で変更できます。</p>\n<h2 id=\"eventに対応する挙動の設定\" style=\"position:relative;\"><a href=\"#event%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%99%E3%82%8B%E6%8C%99%E5%8B%95%E3%81%AE%E8%A8%AD%E5%AE%9A\" aria-label=\"eventに対応する挙動の設定 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Eventに対応する挙動の設定</h2>\n<p>Udon Graphのときと同じ名前の関数をoverrideで宣言します。他は解説することがないと思います。</p>\n<div class=\"gatsby-highlight\" data-language=\"csharp\"><pre style=\"counter-reset: linenumber NaN\" class=\"language-csharp line-numbers\"><code class=\"language-csharp\"><span class=\"token keyword\">public</span> <span class=\"token keyword\">override</span> <span class=\"token return-type class-name\"><span class=\"token keyword\">void</span></span> <span class=\"token function\">OnPlayerJoined</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">VRCPlayerApi</span> player<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>is_active<span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">{</span>\n            <span class=\"token function\">SendCustomEvent</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"MirrorOn\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n        <span class=\"token keyword\">else</span>\n        <span class=\"token punctuation\">{</span>\n            <span class=\"token function\">SendCustomEvent</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"MirrorOff\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div>\n<h1 id=\"あとがき\" style=\"position:relative;\"><a href=\"#%E3%81%82%E3%81%A8%E3%81%8C%E3%81%8D\" aria-label=\"あとがき permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>　あとがき</h1>\n<p>まず、パッと見ただけでも、C#のほうがUdon Graphより簡単だということがわかってもらえると思います。この複雑度でこの差ですから、もう少し複雑になるとUdonSharpの効用は計り知れないと思います。  C#実装をみて、「Udon Graphは意外と簡単にC#に変換できるんだな」ということだけでもわかってもらえると嬉しいです。</p>\n<p>本稿の内容だけで概念としては、Udon Sharpの実装のほぼすべてみたいな感じになると思いますが、実際にはいろいろ複雑な部分もあります。<br>\nもう少し勉強したい方はaki_lua87氏が実装されたoxゲーム、リバーシのコードを確認してみると良いと思います。<br>\n<a href=\"https://aki-lua87.booth.pm/\">https://aki-lua87.booth.pm/</a>  </p>","tableOfContents":"<ul>\n<li><a href=\"/udonsharp1/#%E6%A6%82%E8%A6%81\">概要</a></li>\n<li>\n<p><a href=\"/udonsharp1/#%E4%BA%8B%E5%89%8D%E7%9F%A5%E8%AD%98\">事前知識</a></p>\n<ul>\n<li>\n<ul>\n<li><a href=\"/udonsharp1/#vrchat%E3%83%AF%E3%83%BC%E3%83%AB%E3%83%89%E4%BD%9C%E6%88%90\">VRChatワールド作成</a></li>\n<li><a href=\"/udonsharp1/#udon-graph%E3%81%AB%E3%82%88%E3%82%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0\">Udon Graphによるプログラミング</a></li>\n</ul>\n</li>\n</ul>\n</li>\n<li><a href=\"/udonsharp1/#%E4%BA%8B%E5%89%8D%E6%BA%96%E5%82%99\">事前準備</a></li>\n<li>\n<p><a href=\"/udonsharp1/#1-c%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E5%8B%95%E3%81%8B%E3%81%99%E3%81%BE%E3%81%A7\">1. C#コードを動かすまで</a></p>\n<ul>\n<li><a href=\"/udonsharp1/#%E5%87%BA%E7%99%BA%E7%82%B9\">出発点</a></li>\n<li><a href=\"/udonsharp1/#c%E3%81%A7%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%99%E3%82%8B%E3%83%A2%E3%83%BC%E3%83%89\">C#でコーディングするモード</a></li>\n<li><a href=\"/udonsharp1/#%E9%8F%A1%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81%E3%81%AEc%E3%82%B3%E3%83%BC%E3%83%89\">鏡スイッチのC#コード</a></li>\n<li><a href=\"/udonsharp1/#%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB--%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E8%A8%AD%E5%AE%9A\">コンパイル &#x26; オブジェクト設定</a></li>\n<li><a href=\"/udonsharp1/#%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8D\">動作確認</a></li>\n</ul>\n</li>\n<li>\n<p><a href=\"/udonsharp1/#2-%E3%82%B3%E3%83%BC%E3%83%89%E8%A7%A3%E8%AA%AC\">2. コード解説</a></p>\n<ul>\n<li><a href=\"/udonsharp1/#%E4%BB%96%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E5%88%A9%E7%94%A8\">他オブジェクトの利用</a></li>\n<li>\n<p><a href=\"/udonsharp1/#interact%E6%99%82%E3%81%AE%E6%8C%99%E5%8B%95%E3%81%AE%E8%A8%AD%E5%AE%9A\">　Interact時の挙動の設定</a></p>\n<ul>\n<li><a href=\"/udonsharp1/#%E3%83%87%E3%83%90%E3%83%83%E3%82%B0\">デバッグ</a></li>\n</ul>\n</li>\n<li><a href=\"/udonsharp1/#customevent%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%99%E3%82%8B%E6%8C%99%E5%8B%95%E3%81%AE%E8%A8%AD%E5%AE%9A\">CustomEventに対応する挙動の設定</a></li>\n<li><a href=\"/udonsharp1/#event%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%99%E3%82%8B%E6%8C%99%E5%8B%95%E3%81%AE%E8%A8%AD%E5%AE%9A\">Eventに対応する挙動の設定</a></li>\n</ul>\n</li>\n<li><a href=\"/udonsharp1/#%E3%81%82%E3%81%A8%E3%81%8C%E3%81%8D\">　あとがき</a></li>\n</ul>","frontmatter":{"title":"UdonをC#で書く方法　初歩編","date":"January 03, 2022","description":"VRChatでのギミックを作るためのツールUdonをUdon GraphではなくC#で利用する方法"}}},"pageContext":{"slug":"/udonsharp1/","previous":{"fields":{"slug":"/wandalgorithm/"},"frontmatter":{"title":"WANDアルゴリズム、効率的なTop-kのために"}},"next":{"fields":{"slug":"/ante_compile/"},"frontmatter":{"title":"Anteをコンパイルするときの謎つまづきポイント"}}}}}