<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ゲーム開発 | 藤原工房</title>
	<atom:link href="https://fujiwarakoubou.jp/category/game-development/feed/" rel="self" type="application/rss+xml" />
	<link>https://fujiwarakoubou.jp</link>
	<description>とあるアプリ開発者のブログ</description>
	<lastBuildDate>Wed, 17 Apr 2024 16:26:23 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2017/10/cropped-job_programmer.png?fit=32%2C32&#038;ssl=1</url>
	<title>ゲーム開発 | 藤原工房</title>
	<link>https://fujiwarakoubou.jp</link>
	<width>32</width>
	<height>32</height>
</image> 
<atom:link rel="hub" href="https://pubsubhubbub.appspot.com"/>
<atom:link rel="hub" href="https://pubsubhubbub.superfeedr.com"/>
<atom:link rel="hub" href="https://websubhub.com/hub"/>
<atom:link rel="self" href="https://fujiwarakoubou.jp/category/game-development/feed/"/>
<site xmlns="com-wordpress:feed-additions:1">117887618</site>	<item>
		<title>Unity+MagicOnion+VSCodeの環境構築などの二番煎じ</title>
		<link>https://fujiwarakoubou.jp/2022/04/24/unity-magiconion-vscode/</link>
					<comments>https://fujiwarakoubou.jp/2022/04/24/unity-magiconion-vscode/#respond</comments>
		
		<dc:creator><![CDATA[fujiwarakoubou]]></dc:creator>
		<pubDate>Sun, 24 Apr 2022 03:58:15 +0000</pubDate>
				<category><![CDATA[環境構築]]></category>
		<category><![CDATA[Unity]]></category>
		<guid isPermaLink="false">https://fujiwarakoubou.jp/?p=1094</guid>

					<description><![CDATA[<p>プリグラ（プリコネ！グランドマスターズ）で少し話題になったMagicOnionを試しに使ってみたいって方が環境構築するときに参考になれば幸いです。結構二番煎じだと思いますが、まだMagicOnionの文献が少ないので少し [&#8230;]</p>
The post <a href="https://fujiwarakoubou.jp/2022/04/24/unity-magiconion-vscode/">Unity+MagicOnion+VSCodeの環境構築などの二番煎じ</a> first appeared on <a href="https://fujiwarakoubou.jp">藤原工房</a>.]]></description>
										<content:encoded><![CDATA[<p><a class="a2a_button_hatena" href="https://www.addtoany.com/add_to/hatena?linkurl=https%3A%2F%2Ffujiwarakoubou.jp%2F2022%2F04%2F24%2Funity-magiconion-vscode%2F&amp;linkname=Unity%2BMagicOnion%2BVSCode%E3%81%AE%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E3%81%AA%E3%81%A9%E3%81%AE%E4%BA%8C%E7%95%AA%E7%85%8E%E3%81%98" title="Hatena" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Ffujiwarakoubou.jp%2F2022%2F04%2F24%2Funity-magiconion-vscode%2F&amp;linkname=Unity%2BMagicOnion%2BVSCode%E3%81%AE%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E3%81%AA%E3%81%A9%E3%81%AE%E4%BA%8C%E7%95%AA%E7%85%8E%E3%81%98" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Ffujiwarakoubou.jp%2F2022%2F04%2F24%2Funity-magiconion-vscode%2F&amp;linkname=Unity%2BMagicOnion%2BVSCode%E3%81%AE%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E3%81%AA%E3%81%A9%E3%81%AE%E4%BA%8C%E7%95%AA%E7%85%8E%E3%81%98" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_line" href="https://www.addtoany.com/add_to/line?linkurl=https%3A%2F%2Ffujiwarakoubou.jp%2F2022%2F04%2F24%2Funity-magiconion-vscode%2F&amp;linkname=Unity%2BMagicOnion%2BVSCode%E3%81%AE%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E3%81%AA%E3%81%A9%E3%81%AE%E4%BA%8C%E7%95%AA%E7%85%8E%E3%81%98" title="Line" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_reddit" href="https://www.addtoany.com/add_to/reddit?linkurl=https%3A%2F%2Ffujiwarakoubou.jp%2F2022%2F04%2F24%2Funity-magiconion-vscode%2F&amp;linkname=Unity%2BMagicOnion%2BVSCode%E3%81%AE%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E3%81%AA%E3%81%A9%E3%81%AE%E4%BA%8C%E7%95%AA%E7%85%8E%E3%81%98" title="Reddit" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Ffujiwarakoubou.jp%2F2022%2F04%2F24%2Funity-magiconion-vscode%2F&amp;linkname=Unity%2BMagicOnion%2BVSCode%E3%81%AE%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E3%81%AA%E3%81%A9%E3%81%AE%E4%BA%8C%E7%95%AA%E7%85%8E%E3%81%98" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_pocket" href="https://www.addtoany.com/add_to/pocket?linkurl=https%3A%2F%2Ffujiwarakoubou.jp%2F2022%2F04%2F24%2Funity-magiconion-vscode%2F&amp;linkname=Unity%2BMagicOnion%2BVSCode%E3%81%AE%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E3%81%AA%E3%81%A9%E3%81%AE%E4%BA%8C%E7%95%AA%E7%85%8E%E3%81%98" title="Pocket" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Ffujiwarakoubou.jp%2F2022%2F04%2F24%2Funity-magiconion-vscode%2F&amp;linkname=Unity%2BMagicOnion%2BVSCode%E3%81%AE%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E3%81%AA%E3%81%A9%E3%81%AE%E4%BA%8C%E7%95%AA%E7%85%8E%E3%81%98" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_pinterest" href="https://www.addtoany.com/add_to/pinterest?linkurl=https%3A%2F%2Ffujiwarakoubou.jp%2F2022%2F04%2F24%2Funity-magiconion-vscode%2F&amp;linkname=Unity%2BMagicOnion%2BVSCode%E3%81%AE%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E3%81%AA%E3%81%A9%E3%81%AE%E4%BA%8C%E7%95%AA%E7%85%8E%E3%81%98" title="Pinterest" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Ffujiwarakoubou.jp%2F2022%2F04%2F24%2Funity-magiconion-vscode%2F&#038;title=Unity%2BMagicOnion%2BVSCode%E3%81%AE%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E3%81%AA%E3%81%A9%E3%81%AE%E4%BA%8C%E7%95%AA%E7%85%8E%E3%81%98" data-a2a-url="https://fujiwarakoubou.jp/2022/04/24/unity-magiconion-vscode/" data-a2a-title="Unity+MagicOnion+VSCodeの環境構築などの二番煎じ"></a></p>
<p>プリグラ（<em>プリコネ</em>！<em>グランド</em>マスターズ）で少し話題になったMagicOnionを試しに使ってみたいって方が環境構築するときに参考になれば幸いです。結構二番煎じだと思いますが、まだMagicOnionの文献が少ないので少しでも貢献できればいいな。</p>



<h2 class="wp-block-heading">はじめに</h2>



<p>MagicOnionは、アプリとサーバーをC#言語で統一しgRPCでつないでしまおうという通信フレームワークです。</p>



<p>何でC#言語かというとUnityがC#ってのが影響力大きいと思います（ただUnityのC#は「Unity独自のC#」なので厄介な問題があるんですけどね）。</p>



<p>Unityで使える貴重な通信フレームワーク（他には最近だと開発途上のNetcodeなど）なので詳しく知りたいという人はかなり多いと思いますし、最近は確実に企業での採用実績も増えてきています。</p>



<p>ただMagicOnion、環境構築が少しクセがあります。</p>



<p>アプリとサーバーを共通化する以上、環境構築の際に必要な知識もアプリ側、サーバー側と、今まで別々に担当者が分かれていた両面必要になるので、そこが曲者となってきます。</p>



<p>この記事では、その辺りも踏まえて解説していこうと思います。</p>



<h2 class="wp-block-heading">ディレクトリ構成の完成予想図</h2>



<p>まず最初に全体像を見てもらった方が分かりやすいかな。</p>



<p>MagicOnionは共通化という概念の自由度の高さから、各々のプロジェクトの都合に合わせて様々な構成を作ることができます。</p>



<p>逆に言えば千差万別になりやすく、それ故に初学者が目標を見失いやすい部分があります。</p>



<p>分かりやすさ重視として、私は今回こんな感じのディレクトリ構成にしました。</p>



<figure class="wp-block-image aligncenter size-large"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/312c86a099b27382f4a2675763a41164-3.png?ssl=1"><img data-recalc-dims="1" fetchpriority="high" decoding="async" width="596" height="890" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/312c86a099b27382f4a2675763a41164-3.png?resize=596%2C890&#038;ssl=1" alt="" class="wp-image-1101" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/312c86a099b27382f4a2675763a41164-3.png?w=596&amp;ssl=1 596w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/312c86a099b27382f4a2675763a41164-3.png?resize=201%2C300&amp;ssl=1 201w" sizes="(max-width: 596px) 100vw, 596px" /></a><figcaption class="wp-element-caption">VisualStudioCodeでの全体図</figcaption></figure>



<p class="has-text-align-left">オレンジ：Unityプロジェクト<br>赤：アプリ側<br>黄緑：サーバー側</p>



<p>MagicOnion2というひとつの大きなUnityプロジェクト（3Dテンプレート）の中に、サーバー用のフォルダが内臓されている形になっています。</p>



<p>サーバー用のフォルダ（Server）をUnityプロジェクトの外に出して管理することも出来ますが、今回は分かりやすさ重視で。</p>



<p>この完成形を目指して環境構築を始めます。</p>



<h2 class="wp-block-heading">Unityプロジェクトの作成</h2>



<p>アプリ側の環境構築から行きますね。</p>



<p>Unityプロジェクトの作成については特に不要かと思いますが、UnityHubから「新しいプロジェクト」→テンプレート「3D」→エディタバージョン「2021.3.0f1」を選んでプロジェクト名（私のはMagicOnion2）を指定して「プロジェクトを作成」って感じです。</p>



<p>※今回はUnity2021での動作確認もかねていました。</p>



<figure class="wp-block-image aligncenter size-large"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/56af0e7bea32d6237691faf7dd128347.png?ssl=1" target="_blank" rel="noopener noreferrer"><img data-recalc-dims="1" decoding="async" width="1014" height="585" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/56af0e7bea32d6237691faf7dd128347.png?resize=1014%2C585&#038;ssl=1" alt="" class="wp-image-1103" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/56af0e7bea32d6237691faf7dd128347.png?w=1014&amp;ssl=1 1014w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/56af0e7bea32d6237691faf7dd128347.png?resize=300%2C173&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/56af0e7bea32d6237691faf7dd128347.png?resize=768%2C443&amp;ssl=1 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></a><figcaption class="wp-element-caption">UnityHubのデザインが黒基調になった！</figcaption></figure>



<p class="has-text-align-left">プロジェクトが作成出来たら、プロジェクト設定を少し変更する。</p>



<figure class="wp-block-image aligncenter size-large"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/4bbfc0eff61b7165611a3b31b1b118be.png?ssl=1" target="_blank" rel="noopener noreferrer"><img data-recalc-dims="1" decoding="async" width="1024" height="468" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/4bbfc0eff61b7165611a3b31b1b118be.png?resize=1024%2C468&#038;ssl=1" alt="" class="wp-image-1105" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/4bbfc0eff61b7165611a3b31b1b118be.png?resize=1024%2C468&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/4bbfc0eff61b7165611a3b31b1b118be.png?resize=300%2C137&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/4bbfc0eff61b7165611a3b31b1b118be.png?resize=768%2C351&amp;ssl=1 768w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/4bbfc0eff61b7165611a3b31b1b118be.png?resize=1200%2C549&amp;ssl=1 1200w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/4bbfc0eff61b7165611a3b31b1b118be.png?w=1340&amp;ssl=1 1340w" sizes="(max-width: 1000px) 100vw, 1000px" /></a><figcaption class="wp-element-caption">日本語化は各自やってね！</figcaption></figure>



<p>API互換性レベルを「.NET standard 2.1」から「.NET Framework」に変更する。<br>（理由についてはアプリ実装の部分で解説します）</p>



<p>他所様では「スクリプティングバックエンドをIL2CPPにしなさい」ってあったりしますが、今回は不要です。</p>



<p>IL2CPPはC#をC++として変換する仕組みで、iOSビルドなどに必要になります。<br>（通常はMonoというUnity独自の.NET互換C#コンパイラを使います）</p>



<p>MagicOnionはC#で出来ているので、IL2CPPで構成する場合は同じようにC++変換する作業が必要です。その場合、コードジェネレーター（moc.zip）を使う必要があり環境構築が複雑になります。・・・ので、今回は使いません！</p>



<p>気付いた方もいらっしゃると思いますが、「スクリプティング ランタイム バージョン（Scripting Runtime Version）」という項目が無くなっています。</p>



<p>以前はそこで「.NET 4.x Equivalent」などを選択する必要がありましたが、Unity2019から「.Net3.5」が無くなったので項目が無くなりAPI互換性レベル（Api Compatibility Level）に統一されました。</p>



<p>つまりAPI互換性レベルを「.NET Framework」にしておけば、「.NET 4.x Equivalent」を選択するのと同じになります。</p>



<h2 class="wp-block-heading">MagicOnionをプロジェクトに追加</h2>



<p>公式ドキュメントから<br><a href="https://github.com/Cysharp/MagicOnion#support-for-unity-client">https://github.com/Cysharp/MagicOnion#support-for-unity-client</a></p>



<p>MagicOnionリリースページへ<br><a href="https://github.com/cysharp/MagicOnion/releases">https://github.com/cysharp/MagicOnion/releases</a></p>



<figure class="wp-block-image aligncenter size-large"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/magiconion.png?ssl=1" target="_blank" rel="noopener noreferrer"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="755" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/magiconion.png?resize=1024%2C755&#038;ssl=1" alt="" class="wp-image-1106" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/magiconion.png?resize=1024%2C755&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/magiconion.png?resize=300%2C221&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/magiconion.png?resize=768%2C566&amp;ssl=1 768w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/magiconion.png?w=1148&amp;ssl=1 1148w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></a><figcaption class="wp-element-caption">moc.4.4.1.zipは今回不要</figcaption></figure>



<p>そして「MagicOnion.Client.Unity.unitypackage」をダウンロードして、Unityプロジェクトにインポートします。</p>



<figure class="wp-block-image aligncenter size-large"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/cb0eeba7ea370e5093fe4147662801e3.png?ssl=1" target="_blank" rel="noopener noreferrer"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="499" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/cb0eeba7ea370e5093fe4147662801e3.png?resize=1024%2C499&#038;ssl=1" alt="" class="wp-image-1113" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/cb0eeba7ea370e5093fe4147662801e3.png?resize=1024%2C499&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/cb0eeba7ea370e5093fe4147662801e3.png?resize=300%2C146&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/cb0eeba7ea370e5093fe4147662801e3.png?resize=768%2C374&amp;ssl=1 768w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/cb0eeba7ea370e5093fe4147662801e3.png?resize=1536%2C748&amp;ssl=1 1536w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/cb0eeba7ea370e5093fe4147662801e3.png?resize=1200%2C585&amp;ssl=1 1200w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/cb0eeba7ea370e5093fe4147662801e3.png?w=1886&amp;ssl=1 1886w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></a></figure>



<h2 class="wp-block-heading">gRPCをプロジェクトに追加</h2>



<p>公式ドキュメントからgRPC公式ページに行き<br><a href="https://packages.grpc.io/">https://packages.grpc.io/</a></p>



<p>最新の「Build ID」項目にあるリンク→「C#」の「grpc_unity_package.2.47.0-dev202204190851.zip」をダウンロードして展開します。</p>



<figure class="wp-block-image aligncenter size-large"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/grpc.png?ssl=1" target="_blank" rel="noopener noreferrer"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="476" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/grpc.png?resize=1024%2C476&#038;ssl=1" alt="" class="wp-image-1108" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/grpc.png?resize=1024%2C476&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/grpc.png?resize=300%2C140&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/grpc.png?resize=768%2C357&amp;ssl=1 768w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/grpc.png?resize=1536%2C714&amp;ssl=1 1536w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/grpc.png?resize=1200%2C558&amp;ssl=1 1200w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/grpc.png?w=1834&amp;ssl=1 1834w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></a><figcaption class="wp-element-caption">右下のf15a2c1c-582b-4c51-acf2-ab6d711d2c59</figcaption></figure>



<figure class="wp-block-image aligncenter size-large"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/grpc2.png?ssl=1" target="_blank" rel="noopener noreferrer"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="471" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/grpc2.png?resize=1024%2C471&#038;ssl=1" alt="" class="wp-image-1109" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/grpc2.png?resize=1024%2C471&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/grpc2.png?resize=300%2C138&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/grpc2.png?resize=768%2C353&amp;ssl=1 768w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/grpc2.png?resize=1536%2C706&amp;ssl=1 1536w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/grpc2.png?resize=1200%2C552&amp;ssl=1 1200w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/grpc2.png?w=1857&amp;ssl=1 1857w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></a></figure>



<p>zip展開した中の「Google.Protobuf」「Grpc.Core」「Grpc.Core.Api」だけをUnityプロジェクトのAsset/Pluginsにコピーします。</p>



<figure class="wp-block-image aligncenter size-large is-resized"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/grpc3.png?ssl=1" target="_blank" rel="noopener noreferrer"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="272" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/grpc3.png?resize=1024%2C272&#038;ssl=1" alt="" class="wp-image-1110" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/grpc3.png?resize=1024%2C272&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/grpc3.png?resize=300%2C80&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/grpc3.png?resize=768%2C204&amp;ssl=1 768w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/grpc3.png?resize=1200%2C318&amp;ssl=1 1200w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/grpc3.png?w=1527&amp;ssl=1 1527w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></a><figcaption class="wp-element-caption">zipの中には他にもあるけど、この3つだけでいい</figcaption></figure>



<p>間違って全部コピーすると画像のようなエラーが発生しますが、先ほどの3つのフォルダ以外を削除すれば大丈夫です。</p>



<figure class="wp-block-image aligncenter size-large"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/20c2bd2a5bf4e3bde16adc8849f3d5d3.png?ssl=1" target="_blank" rel="noopener noreferrer"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="636" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/20c2bd2a5bf4e3bde16adc8849f3d5d3.png?resize=1024%2C636&#038;ssl=1" alt="" class="wp-image-1114" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/20c2bd2a5bf4e3bde16adc8849f3d5d3.png?resize=1024%2C636&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/20c2bd2a5bf4e3bde16adc8849f3d5d3.png?resize=300%2C186&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/20c2bd2a5bf4e3bde16adc8849f3d5d3.png?resize=768%2C477&amp;ssl=1 768w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/20c2bd2a5bf4e3bde16adc8849f3d5d3.png?resize=1536%2C954&amp;ssl=1 1536w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/20c2bd2a5bf4e3bde16adc8849f3d5d3.png?resize=1200%2C745&amp;ssl=1 1200w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/20c2bd2a5bf4e3bde16adc8849f3d5d3.png?w=1548&amp;ssl=1 1548w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></a></figure>



<figure class="wp-block-image aligncenter size-large"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/3cf715be6e88431fb78a82041b36cd4d.png?ssl=1" target="_blank" rel="noopener noreferrer"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="550" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/3cf715be6e88431fb78a82041b36cd4d.png?resize=1024%2C550&#038;ssl=1" alt="" class="wp-image-1115" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/3cf715be6e88431fb78a82041b36cd4d.png?resize=1024%2C550&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/3cf715be6e88431fb78a82041b36cd4d.png?resize=300%2C161&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/3cf715be6e88431fb78a82041b36cd4d.png?resize=768%2C412&amp;ssl=1 768w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/3cf715be6e88431fb78a82041b36cd4d.png?resize=1536%2C825&amp;ssl=1 1536w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/3cf715be6e88431fb78a82041b36cd4d.png?resize=1200%2C644&amp;ssl=1 1200w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/3cf715be6e88431fb78a82041b36cd4d.png?w=1905&amp;ssl=1 1905w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></a></figure>



<h2 class="wp-block-heading">MessagePackをプロジェクトに追加</h2>



<p>公式ドキュメントからMessagePackのリリースページに行き<br><a href="https://github.com/neuecc/MessagePack-CSharp/releases">https://github.com/neuecc/MessagePack-CSharp/releases</a></p>



<p>「MessagePack.Unity.2.3.85.unitypackage」をダウンロードしてUnityプロジェクトにインポートします。</p>



<figure class="wp-block-image aligncenter size-large"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/messagepack.png?ssl=1" target="_blank" rel="noopener noreferrer"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="650" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/messagepack.png?resize=1024%2C650&#038;ssl=1" alt="" class="wp-image-1111" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/messagepack.png?resize=1024%2C650&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/messagepack.png?resize=300%2C190&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/messagepack.png?resize=768%2C488&amp;ssl=1 768w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/messagepack.png?resize=1200%2C762&amp;ssl=1 1200w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/messagepack.png?w=1315&amp;ssl=1 1315w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></a><figcaption class="wp-element-caption">alpha版じゃなくてlatest版で</figcaption></figure>



<p>インポートの際にMagicOnionの「System.Buffers.dll」「System.Memory.dll」「System.Runtime.CompilerServices.Unsafe.dll」「System.Threading.Tasks.Extensions.dll」の重複警告が出ますが上書きしてしまって大丈夫です。</p>



<h2 class="wp-block-heading">VisualStudioCodeの環境構築</h2>



<p>UnityプロジェクトにMagicOnionでアプリを作る準備は出来ました。</p>



<p>次はサーバーと行きたいところですが、その前にVSCodeでC#開発できるように環境構築をします。以下の参考サイト様とやることはほぼ同じです。</p>



<p><em><strong>どうしてもC#をVSCodeで書きたい</strong></em><br><a href="https://qiita.com/_patrush/items/dc8b2f8ea4c59d49c1fd">https://qiita.com/_patrush/items/dc8b2f8ea4c59d49c1fd</a></p>



<p>参考サイトに従って必要な拡張機能をインストール</p>



<figure class="wp-block-image size-large"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/5bbfc433b50bd2209197528ee76ab674.png?ssl=1" target="_blank" rel="noopener noreferrer"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="442" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/5bbfc433b50bd2209197528ee76ab674.png?resize=1024%2C442&#038;ssl=1" alt="" class="wp-image-1120" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/5bbfc433b50bd2209197528ee76ab674.png?resize=1024%2C442&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/5bbfc433b50bd2209197528ee76ab674.png?resize=300%2C129&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/5bbfc433b50bd2209197528ee76ab674.png?resize=768%2C331&amp;ssl=1 768w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/5bbfc433b50bd2209197528ee76ab674.png?resize=1536%2C663&amp;ssl=1 1536w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/5bbfc433b50bd2209197528ee76ab674.png?resize=1200%2C518&amp;ssl=1 1200w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/5bbfc433b50bd2209197528ee76ab674.png?w=1717&amp;ssl=1 1717w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></a><figcaption class="wp-element-caption">拡張機能の追加はVSCodeの左メニューアイコンのテトリスみたいなマーク</figcaption></figure>



<p>Unityプロジェクトのフォルダを開いて</p>



<figure class="wp-block-image aligncenter size-large"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/5cdf7d85bff97a5096166b40a58083e7.png?ssl=1" target="_blank" rel="noopener noreferrer"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="554" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/5cdf7d85bff97a5096166b40a58083e7.png?resize=1024%2C554&#038;ssl=1" alt="" class="wp-image-1118" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/5cdf7d85bff97a5096166b40a58083e7.png?resize=1024%2C554&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/5cdf7d85bff97a5096166b40a58083e7.png?resize=300%2C162&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/5cdf7d85bff97a5096166b40a58083e7.png?resize=768%2C415&amp;ssl=1 768w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/5cdf7d85bff97a5096166b40a58083e7.png?resize=1536%2C831&amp;ssl=1 1536w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/5cdf7d85bff97a5096166b40a58083e7.png?resize=1200%2C649&amp;ssl=1 1200w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/5cdf7d85bff97a5096166b40a58083e7.png?w=1899&amp;ssl=1 1899w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></a><figcaption class="wp-element-caption">「作業の開始」は閉じてOK</figcaption></figure>



<p>「フォルダーをワークスペースに追加」をやって保存すればワークスペースファイルが作成されるので、サイトの内容をコピペした後、「**/Assets/Scripts/Generated」「**/Assets/Scripts/MagicOnion*」「**/Assets/Scripts/MessagePack」の行をコメントアウトします。</p>



<p>こうするとAssetsのスクリプトも見えるようになります。<br>（参考サイトでは非表示設定だけど、アプリ実装で表示する必要がある）</p>



<figure class="wp-block-image aligncenter size-large"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/51c8dac5be329765e5c8d14a588c51a2.png?ssl=1" target="_blank" rel="noopener noreferrer"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="556" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/51c8dac5be329765e5c8d14a588c51a2.png?resize=1024%2C556&#038;ssl=1" alt="" class="wp-image-1119" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/51c8dac5be329765e5c8d14a588c51a2.png?resize=1024%2C556&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/51c8dac5be329765e5c8d14a588c51a2.png?resize=300%2C163&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/51c8dac5be329765e5c8d14a588c51a2.png?resize=768%2C417&amp;ssl=1 768w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/51c8dac5be329765e5c8d14a588c51a2.png?resize=1536%2C835&amp;ssl=1 1536w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/51c8dac5be329765e5c8d14a588c51a2.png?resize=1200%2C652&amp;ssl=1 1200w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/51c8dac5be329765e5c8d14a588c51a2.png?w=1905&amp;ssl=1 1905w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></a></figure>



<figure class="wp-block-image aligncenter size-large"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/a1748a1cc1d8a668209e52c1fe2ea346.png?ssl=1" target="_blank" rel="noopener noreferrer"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="554" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/a1748a1cc1d8a668209e52c1fe2ea346.png?resize=1024%2C554&#038;ssl=1" alt="" class="wp-image-1116" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/a1748a1cc1d8a668209e52c1fe2ea346.png?resize=1024%2C554&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/a1748a1cc1d8a668209e52c1fe2ea346.png?resize=300%2C162&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/a1748a1cc1d8a668209e52c1fe2ea346.png?resize=768%2C416&amp;ssl=1 768w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/a1748a1cc1d8a668209e52c1fe2ea346.png?resize=1536%2C831&amp;ssl=1 1536w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/a1748a1cc1d8a668209e52c1fe2ea346.png?resize=1200%2C649&amp;ssl=1 1200w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/a1748a1cc1d8a668209e52c1fe2ea346.png?w=1879&amp;ssl=1 1879w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></a><figcaption class="wp-element-caption">magiconion2.code-workspaceがワークスペースファイル</figcaption></figure>



<p>「extensions.json」はUnityプロジェクトの「.vscode」フォルダの中に入れます。<br>（VSCodeで開いたときに.vscodeフォルダが自動生成されるはず？）</p>



<figure class="wp-block-image aligncenter size-large"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/extensions.png?ssl=1" target="_blank" rel="noopener noreferrer"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="556" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/extensions.png?resize=1024%2C556&#038;ssl=1" alt="" class="wp-image-1117" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/extensions.png?resize=1024%2C556&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/extensions.png?resize=300%2C163&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/extensions.png?resize=768%2C417&amp;ssl=1 768w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/extensions.png?resize=1536%2C835&amp;ssl=1 1536w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/extensions.png?resize=1200%2C652&amp;ssl=1 1200w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/extensions.png?w=1879&amp;ssl=1 1879w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></a><figcaption class="wp-element-caption">正直不要だけどまぁ一応</figcaption></figure>



<p>これでC#の開発環境はだいたいOKだと思います。</p>



<h2 class="wp-block-heading">MagicOnionサーバーの環境構築</h2>



<p>VSCodeの設定が終わったら、そのままServerフォルダを作成して、その中にMagicOnionのサーバーを構築します。<br>（アプリもMagicOnionというのでややこしいです）</p>



<p>公式ドキュメントには「dotnet app package MagicOnion.Sever」（.NETコマンド）を使って追加すると書いてありますが、ちょっと初心者には説明不足で、そのまま実行すると失敗します。</p>



<figure class="wp-block-image aligncenter size-large"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/dotnet1.png?ssl=1" target="_blank" rel="noopener noreferrer"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="525" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/dotnet1.png?resize=1024%2C525&#038;ssl=1" alt="" class="wp-image-1121" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/dotnet1.png?resize=1024%2C525&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/dotnet1.png?resize=300%2C154&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/dotnet1.png?resize=768%2C394&amp;ssl=1 768w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/dotnet1.png?resize=1536%2C787&amp;ssl=1 1536w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/dotnet1.png?resize=1200%2C615&amp;ssl=1 1200w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/dotnet1.png?w=1883&amp;ssl=1 1883w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></a><figcaption class="wp-element-caption">こんな感じにエラーになる</figcaption></figure>



<p>（既に開いてるかもですが）先ほど作成したSeverフォルダを右クリックして「統合ターミナルで開く」を選択します。</p>



<p>メニュー「ターミナル」からでもいいですが、フォルダから開くとコマンドラインのパスがそこになるので便利です。</p>



<p>Severの中で「dotnet new grpc」を実行します。</p>



<p>MagicOnionはgRPCで作られているので、gRPCプロジェクトを指定して作成します。<br>（Severフォルダの中に色々追加されます）</p>



<p>その後に「dotnet add package MagicOnion.Sever」を実行します。</p>



<figure class="wp-block-image aligncenter size-large"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/dotnet2.png?ssl=1" target="_blank" rel="noopener noreferrer"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="552" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/dotnet2.png?resize=1024%2C552&#038;ssl=1" alt="" class="wp-image-1122" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/dotnet2.png?resize=1024%2C552&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/dotnet2.png?resize=300%2C162&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/dotnet2.png?resize=768%2C414&amp;ssl=1 768w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/dotnet2.png?resize=1536%2C828&amp;ssl=1 1536w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/dotnet2.png?resize=1200%2C647&amp;ssl=1 1200w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/dotnet2.png?w=1889&amp;ssl=1 1889w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></a></figure>



<p>後は公式ドキュメントにある通り、Severの中に作成されたStartup.csの内容を変更します。</p>



<p>最後に「dotnet run」でサーバーが起動すれば完了です。</p>



<figure class="wp-block-image aligncenter size-large is-resized"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/startup.png?ssl=1" target="_blank" rel="noopener noreferrer"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="558" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/startup.png?resize=1024%2C558&#038;ssl=1" alt="" class="wp-image-1123" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/startup.png?resize=1024%2C558&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/startup.png?resize=300%2C163&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/startup.png?resize=768%2C418&amp;ssl=1 768w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/startup.png?resize=1536%2C836&amp;ssl=1 1536w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/startup.png?resize=1200%2C653&amp;ssl=1 1200w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/startup.png?w=1873&amp;ssl=1 1873w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></a><figcaption class="wp-element-caption">Ctrl+Cで停止できます</figcaption></figure>



<h2 class="wp-block-heading">共通インタフェースの作成</h2>



<p>ここまでお疲れさまでした。</p>



<p>環境構築が終わったら、いよいよ通信アプリの実装をやって行こうと思います。</p>



<p>まずはMagicOnionでの共通インタフェース「IMyFirstService.cs」を作成します。</p>



<p>IMyFirstServiceの内容は公式ドキュメントと同じで大丈夫です。</p>



<figure class="wp-block-image aligncenter size-large"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/imyfirstservice.png?ssl=1" target="_blank" rel="noopener noreferrer"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="554" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/imyfirstservice.png?resize=1024%2C554&#038;ssl=1" alt="" class="wp-image-1128" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/imyfirstservice.png?resize=1024%2C554&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/imyfirstservice.png?resize=300%2C162&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/imyfirstservice.png?resize=768%2C415&amp;ssl=1 768w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/imyfirstservice.png?resize=1536%2C830&amp;ssl=1 1536w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/imyfirstservice.png?resize=1200%2C649&amp;ssl=1 1200w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/imyfirstservice.png?w=1883&amp;ssl=1 1883w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></a></figure>



<p>ファイルの位置だけ注意が必要で、このIMyFirstServiceをサーバーから参照設定するので、他の共通化しないファイルと別々に分ける必要があります。</p>



<p>また、UnityでIMyFirstServiceを使いたい場合、これをUnityコンパイルする必要があるので、Asset内に存在していないといけません。</p>



<p>ディレクトリ構成は自分も悩みましたが、namespaceと同じようなフォルダ構成で「Assets/Scrips/MyApp/Shared/IMyFirstService.cs」としました。ここら辺は割と自由だと思います。</p>



<h2 class="wp-block-heading">アプリ部分の実装</h2>



<p>次に通信アプリの実装を行います。</p>



<p>公式ドキュメントと以下のサイト様を参考に「SampleAppCall.cs」作りました。</p>



<p><strong><em>UnityとMagicOnionの環境構築（IL2CPP）</em></strong><br><a href="https://zenn.dev/kumatta_ss/articles/dab376b180aa85">https://zenn.dev/kumatta_ss/articles/dab376b180aa85</a></p>



<p>注意点としては、公式ドキュメントでは「GrpcChannel」を使っていますが、これはUnityでは利用することが出来ませんのでコメントアウトして、2行下の「new Channel」の方を使います。</p>



<p>またgRPCのssl通信が今のUnity環境では出来ないっぽい？ので、ポート番号5001を5000にして、ChannelCredentials.Insecure（安全でないセキュア）を指定します。</p>



<p>この辺りの問題は、Unityのプロジェクト設定「.NET standard 2.1」「.NET Framework」と密接に関係しています。</p>



<figure class="wp-block-image aligncenter size-large"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/sampleAppcall.png?ssl=1" target="_blank" rel="noopener noreferrer"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="542" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/sampleAppcall.png?resize=1024%2C542&#038;ssl=1" alt="" class="wp-image-1125" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/sampleAppcall.png?resize=1024%2C542&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/sampleAppcall.png?resize=300%2C159&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/sampleAppcall.png?resize=768%2C406&amp;ssl=1 768w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/sampleAppcall.png?resize=1536%2C813&amp;ssl=1 1536w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/sampleAppcall.png?resize=1200%2C635&amp;ssl=1 1200w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/sampleAppcall.png?w=1896&amp;ssl=1 1896w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></a><figcaption class="wp-element-caption">async/await指定が必要なのは注意</figcaption></figure>



<p>アプリのUnityコンパイルが通ったら、Unity上に空のオブジェクトを作成してコンポーネントにこの作成したスクリプトを設定して準備完了です。</p>



<h2 class="wp-block-heading">サーバー部分の実装</h2>



<p>まず共通インタフェースを参照できるようにします。</p>



<p>Severフォルダ内の「Sever.csproj」に「&lt;Compile Include=&#8221;..\Assets\Scripts\MyApp\Shared\**\*.cs&#8221; LinkBase=&#8221;LinkFromUnity&#8221; /&gt;」を追加します。</p>



<p>これでShared以下のスクリプトを全て参照できるようになりました。</p>



<figure class="wp-block-image aligncenter size-large"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/server.png?ssl=1" target="_blank" rel="noopener noreferrer"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="553" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/server.png?resize=1024%2C553&#038;ssl=1" alt="" class="wp-image-1127" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/server.png?resize=1024%2C553&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/server.png?resize=300%2C162&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/server.png?resize=768%2C415&amp;ssl=1 768w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/server.png?resize=1536%2C829&amp;ssl=1 1536w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/server.png?resize=1200%2C648&amp;ssl=1 1200w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/server.png?w=1888&amp;ssl=1 1888w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></a><figcaption class="wp-element-caption">VSCodeだとLinkBaseは意味ないっぽい？</figcaption></figure>



<p>コンパイル参照が出来たら、Sever/Servicesの中に「MyFirstService.cs」を作成します。<br>（内容は公式ドキュメントにある通りです）</p>



<figure class="wp-block-image aligncenter size-large"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/myfirstservice.png?ssl=1" target="_blank" rel="noopener noreferrer"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="550" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/myfirstservice.png?resize=1024%2C550&#038;ssl=1" alt="" class="wp-image-1143" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/myfirstservice.png?resize=1024%2C550&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/myfirstservice.png?resize=300%2C161&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/myfirstservice.png?resize=768%2C412&amp;ssl=1 768w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/myfirstservice.png?resize=1536%2C825&amp;ssl=1 1536w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/myfirstservice.png?resize=1200%2C644&amp;ssl=1 1200w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/myfirstservice.png?w=1894&amp;ssl=1 1894w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></a></figure>



<p>出来たらServerのターミナルを開いて、「dotnet run」を実行します。</p>



<p>asyncに関する警告が表示されますが、とりあえず無視でOK<br>（公式ドキュメント通りだもの）</p>



<p>サーバーを待機中にしたまま、Unityに戻ります。</p>



<figure class="wp-block-image aligncenter size-large"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/08756c0c1b5a74c01efc8ea135b498bb.png?ssl=1" target="_blank" rel="noopener noreferrer"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="545" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/08756c0c1b5a74c01efc8ea135b498bb.png?resize=1024%2C545&#038;ssl=1" alt="" class="wp-image-1131" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/08756c0c1b5a74c01efc8ea135b498bb.png?resize=1024%2C545&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/08756c0c1b5a74c01efc8ea135b498bb.png?resize=300%2C160&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/08756c0c1b5a74c01efc8ea135b498bb.png?resize=768%2C409&amp;ssl=1 768w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/08756c0c1b5a74c01efc8ea135b498bb.png?resize=1536%2C818&amp;ssl=1 1536w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/08756c0c1b5a74c01efc8ea135b498bb.png?resize=1200%2C639&amp;ssl=1 1200w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/08756c0c1b5a74c01efc8ea135b498bb.png?w=1896&amp;ssl=1 1896w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></a><figcaption class="wp-element-caption">awaitを使ってないので非同期処理にならず、同期処理になります警告</figcaption></figure>



<h2 class="wp-block-heading">最後にUnityで動作確認</h2>



<p>後はUnityプロジェクトをテスト実行するだけです。</p>



<p>上手く行けば、Unityのコンソールと、VSCodeのターミナルにログが表示されます。</p>



<figure class="wp-block-image aligncenter size-large"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/e6f2f7d8c9d66d207d9aa17a322b32c1.png?ssl=1" target="_blank" rel="noopener noreferrer"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="557" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/e6f2f7d8c9d66d207d9aa17a322b32c1.png?resize=1024%2C557&#038;ssl=1" alt="" class="wp-image-1133" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/e6f2f7d8c9d66d207d9aa17a322b32c1.png?resize=1024%2C557&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/e6f2f7d8c9d66d207d9aa17a322b32c1.png?resize=300%2C163&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/e6f2f7d8c9d66d207d9aa17a322b32c1.png?resize=768%2C418&amp;ssl=1 768w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/e6f2f7d8c9d66d207d9aa17a322b32c1.png?resize=1536%2C836&amp;ssl=1 1536w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/e6f2f7d8c9d66d207d9aa17a322b32c1.png?resize=1200%2C653&amp;ssl=1 1200w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/e6f2f7d8c9d66d207d9aa17a322b32c1.png?w=1907&amp;ssl=1 1907w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></a><figcaption class="wp-element-caption">プログラムに書かれた足し算の結果が表示される</figcaption></figure>



<figure class="wp-block-image aligncenter size-large"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/6fe23069e59d7ad28931f96cbf21a263.png?ssl=1" target="_blank" rel="noopener noreferrer"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="552" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/6fe23069e59d7ad28931f96cbf21a263.png?resize=1024%2C552&#038;ssl=1" alt="" class="wp-image-1134" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/6fe23069e59d7ad28931f96cbf21a263.png?resize=1024%2C552&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/6fe23069e59d7ad28931f96cbf21a263.png?resize=300%2C162&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/6fe23069e59d7ad28931f96cbf21a263.png?resize=768%2C414&amp;ssl=1 768w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/6fe23069e59d7ad28931f96cbf21a263.png?resize=1536%2C829&amp;ssl=1 1536w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/6fe23069e59d7ad28931f96cbf21a263.png?resize=1200%2C647&amp;ssl=1 1200w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/6fe23069e59d7ad28931f96cbf21a263.png?w=1900&amp;ssl=1 1900w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></a><figcaption class="wp-element-caption">ちなみにブラウザからlocalhost:5000とかやってもサーバーが反応してくれるよ！</figcaption></figure>



<p>サーバーが起動していなかったり、何らかの問題があった時は、Unityのコンソールにエラーが表示されます。<br>（以下はサーバーが起動していなかったとき）</p>



<figure class="wp-block-image aligncenter size-large"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/2955acb66ce0ef4c07ce96e7fab7b3af.png?ssl=1" target="_blank" rel="noopener noreferrer"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="530" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/2955acb66ce0ef4c07ce96e7fab7b3af.png?resize=1024%2C530&#038;ssl=1" alt="" class="wp-image-1132" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/2955acb66ce0ef4c07ce96e7fab7b3af.png?resize=1024%2C530&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/2955acb66ce0ef4c07ce96e7fab7b3af.png?resize=300%2C155&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/2955acb66ce0ef4c07ce96e7fab7b3af.png?resize=768%2C397&amp;ssl=1 768w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/2955acb66ce0ef4c07ce96e7fab7b3af.png?resize=1536%2C795&amp;ssl=1 1536w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/2955acb66ce0ef4c07ce96e7fab7b3af.png?resize=1200%2C621&amp;ssl=1 1200w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2022/04/2955acb66ce0ef4c07ce96e7fab7b3af.png?w=1898&amp;ssl=1 1898w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></a><figcaption class="wp-element-caption">エラーログ詳細の「grpc_stats : 14」の部分が解決のヒントになるかも</figcaption></figure>



<h2 class="wp-block-heading">おまけ</h2>



<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">MagicOnionの環境構築またやるか（3回目）</p>&mdash; 藤原工房 (@FujiwaraKoubou) <a href="https://twitter.com/FujiwaraKoubou/status/1517282608194801664?ref_src=twsrc%5Etfw">April 21, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>The post <a href="https://fujiwarakoubou.jp/2022/04/24/unity-magiconion-vscode/">Unity+MagicOnion+VSCodeの環境構築などの二番煎じ</a> first appeared on <a href="https://fujiwarakoubou.jp">藤原工房</a>.]]></content:encoded>
					
					<wfw:commentRss>https://fujiwarakoubou.jp/2022/04/24/unity-magiconion-vscode/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1094</post-id>	</item>
		<item>
		<title>Netcode for GameObjects（旧名MLAPI）のチュートリアルで大苦戦した記録</title>
		<link>https://fujiwarakoubou.jp/2021/12/05/netcode-tutorial-daikusen/</link>
					<comments>https://fujiwarakoubou.jp/2021/12/05/netcode-tutorial-daikusen/#respond</comments>
		
		<dc:creator><![CDATA[fujiwarakoubou]]></dc:creator>
		<pubDate>Sun, 05 Dec 2021 04:48:09 +0000</pubDate>
				<category><![CDATA[ゲーム開発]]></category>
		<category><![CDATA[Unity]]></category>
		<guid isPermaLink="false">https://fujiwarakoubou.jp/?p=1068</guid>

					<description><![CDATA[<p>Netcodeのチュートリアル的な動画を自分でも実践してみましたが、かなり苦戦したので、せっかくなので記事として記録したいと思います。内容はレベルの低い話も多いかと思いますがご容赦くださいませ。 チュートリアル動画との差 [&#8230;]</p>
The post <a href="https://fujiwarakoubou.jp/2021/12/05/netcode-tutorial-daikusen/">Netcode for GameObjects（旧名MLAPI）のチュートリアルで大苦戦した記録</a> first appeared on <a href="https://fujiwarakoubou.jp">藤原工房</a>.]]></description>
										<content:encoded><![CDATA[<p><a class="a2a_button_hatena" href="https://www.addtoany.com/add_to/hatena?linkurl=https%3A%2F%2Ffujiwarakoubou.jp%2F2021%2F12%2F05%2Fnetcode-tutorial-daikusen%2F&amp;linkname=Netcode%20for%20GameObjects%EF%BC%88%E6%97%A7%E5%90%8DMLAPI%EF%BC%89%E3%81%AE%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%E3%81%A7%E5%A4%A7%E8%8B%A6%E6%88%A6%E3%81%97%E3%81%9F%E8%A8%98%E9%8C%B2" title="Hatena" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Ffujiwarakoubou.jp%2F2021%2F12%2F05%2Fnetcode-tutorial-daikusen%2F&amp;linkname=Netcode%20for%20GameObjects%EF%BC%88%E6%97%A7%E5%90%8DMLAPI%EF%BC%89%E3%81%AE%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%E3%81%A7%E5%A4%A7%E8%8B%A6%E6%88%A6%E3%81%97%E3%81%9F%E8%A8%98%E9%8C%B2" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Ffujiwarakoubou.jp%2F2021%2F12%2F05%2Fnetcode-tutorial-daikusen%2F&amp;linkname=Netcode%20for%20GameObjects%EF%BC%88%E6%97%A7%E5%90%8DMLAPI%EF%BC%89%E3%81%AE%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%E3%81%A7%E5%A4%A7%E8%8B%A6%E6%88%A6%E3%81%97%E3%81%9F%E8%A8%98%E9%8C%B2" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_line" href="https://www.addtoany.com/add_to/line?linkurl=https%3A%2F%2Ffujiwarakoubou.jp%2F2021%2F12%2F05%2Fnetcode-tutorial-daikusen%2F&amp;linkname=Netcode%20for%20GameObjects%EF%BC%88%E6%97%A7%E5%90%8DMLAPI%EF%BC%89%E3%81%AE%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%E3%81%A7%E5%A4%A7%E8%8B%A6%E6%88%A6%E3%81%97%E3%81%9F%E8%A8%98%E9%8C%B2" title="Line" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_reddit" href="https://www.addtoany.com/add_to/reddit?linkurl=https%3A%2F%2Ffujiwarakoubou.jp%2F2021%2F12%2F05%2Fnetcode-tutorial-daikusen%2F&amp;linkname=Netcode%20for%20GameObjects%EF%BC%88%E6%97%A7%E5%90%8DMLAPI%EF%BC%89%E3%81%AE%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%E3%81%A7%E5%A4%A7%E8%8B%A6%E6%88%A6%E3%81%97%E3%81%9F%E8%A8%98%E9%8C%B2" title="Reddit" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Ffujiwarakoubou.jp%2F2021%2F12%2F05%2Fnetcode-tutorial-daikusen%2F&amp;linkname=Netcode%20for%20GameObjects%EF%BC%88%E6%97%A7%E5%90%8DMLAPI%EF%BC%89%E3%81%AE%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%E3%81%A7%E5%A4%A7%E8%8B%A6%E6%88%A6%E3%81%97%E3%81%9F%E8%A8%98%E9%8C%B2" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_pocket" href="https://www.addtoany.com/add_to/pocket?linkurl=https%3A%2F%2Ffujiwarakoubou.jp%2F2021%2F12%2F05%2Fnetcode-tutorial-daikusen%2F&amp;linkname=Netcode%20for%20GameObjects%EF%BC%88%E6%97%A7%E5%90%8DMLAPI%EF%BC%89%E3%81%AE%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%E3%81%A7%E5%A4%A7%E8%8B%A6%E6%88%A6%E3%81%97%E3%81%9F%E8%A8%98%E9%8C%B2" title="Pocket" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Ffujiwarakoubou.jp%2F2021%2F12%2F05%2Fnetcode-tutorial-daikusen%2F&amp;linkname=Netcode%20for%20GameObjects%EF%BC%88%E6%97%A7%E5%90%8DMLAPI%EF%BC%89%E3%81%AE%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%E3%81%A7%E5%A4%A7%E8%8B%A6%E6%88%A6%E3%81%97%E3%81%9F%E8%A8%98%E9%8C%B2" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_pinterest" href="https://www.addtoany.com/add_to/pinterest?linkurl=https%3A%2F%2Ffujiwarakoubou.jp%2F2021%2F12%2F05%2Fnetcode-tutorial-daikusen%2F&amp;linkname=Netcode%20for%20GameObjects%EF%BC%88%E6%97%A7%E5%90%8DMLAPI%EF%BC%89%E3%81%AE%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%E3%81%A7%E5%A4%A7%E8%8B%A6%E6%88%A6%E3%81%97%E3%81%9F%E8%A8%98%E9%8C%B2" title="Pinterest" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Ffujiwarakoubou.jp%2F2021%2F12%2F05%2Fnetcode-tutorial-daikusen%2F&#038;title=Netcode%20for%20GameObjects%EF%BC%88%E6%97%A7%E5%90%8DMLAPI%EF%BC%89%E3%81%AE%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%E3%81%A7%E5%A4%A7%E8%8B%A6%E6%88%A6%E3%81%97%E3%81%9F%E8%A8%98%E9%8C%B2" data-a2a-url="https://fujiwarakoubou.jp/2021/12/05/netcode-tutorial-daikusen/" data-a2a-title="Netcode for GameObjects（旧名MLAPI）のチュートリアルで大苦戦した記録"></a></p>
<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" class="youtube-player" width="640" height="360" src="https://www.youtube.com/embed/GRUtGLL8iMQ?version=3&#038;rel=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;fs=1&#038;hl=ja&#038;autohide=2&#038;wmode=transparent" allowfullscreen="true" style="border:0;" sandbox="allow-scripts allow-same-origin allow-popups allow-presentation allow-popups-to-escape-sandbox"></iframe>
</div></figure>



<p>Netcodeのチュートリアル的な動画を自分でも実践してみましたが、かなり苦戦したので、せっかくなので記事として記録したいと思います。内容はレベルの低い話も多いかと思いますがご容赦くださいませ。</p>



<h2 class="wp-block-heading">チュートリアル動画との差異</h2>



<p>まず初めに前提として書いておかないといけないのは、苦戦した理由の一つに、UnityのStarter Assetsで再現しようとしたことがあります。</p>



<p>これは動画の中のサンプルが公開されていましたが、勉強のためにもUnityの標準アセットでも再現できれば、今後応用したいと思ったときに楽になると思ったからです（結果として大苦戦しますが<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f97a.png" alt="🥺" class="wp-smiley" style="height: 1em; max-height: 1em;" />）</p>



<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Netcodeで今回使ったやつ<a href="https://t.co/cs4qZLz40y">https://t.co/cs4qZLz40y</a></p>&mdash; 藤原工房 (@FujiwaraKoubou) <a href="https://twitter.com/FujiwaraKoubou/status/1467315455077777408?ref_src=twsrc%5Etfw">December 5, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 



<span id="more-1068"></span>



<h2 class="wp-block-heading">Starter Assetによる再現方法</h2>



<p>もしかすると、この記事を見て自分で同じことをやって見たいという人がいるかもしれないので、構築方法を書いておきます。</p>



<p>環境<br>Windows10、Unity2021.2.5f1（NetcodeはUnity2021から対応）、Visual Studio Code</p>



<p>①Starter Assetを全てインポートしたら「Asset &gt; Starter Assets &gt; Environment &gt; Prefabs &gt; Environment_Prefab.prefab」を自分のシーンにドラッグ＆ドロップして配置します。</p>



<p>②元からあるMainCameraを削除して「Asset &gt; Starter Assets &gt; ThirdPersonController &gt; Prefabs &gt; MainCamera.prefab」を自分のシーンにドラッグ＆ドロップして配置します。</p>



<p>③「Asset &gt; Starter Assets &gt; ThirdPersonController &gt; Prefabs &gt; PlayerArmature.prefab」を自分のシーンにドラッグ＆ドロップして配置します。</p>



<p>④このPlayerArmatureを編集したいので、自分の「Asset &gt; Scenes」にドラッグ＆ドロップして、バリアントとしてコピーします（コピーするときに選択肢が出ます）。</p>



<p>⑤最後に③で作ったコピー元のプレハブを削除します。</p>



<p>あとはチュートリアル動画の進む通りにNetworkManagerなどを入れていきます。</p>



<p><strong><span class="has-inline-color has-bright-red-color">※以下は、チュートリアル動画を見た前提で書いていますのでご注意ください。</span></strong></p>



<h2 class="wp-block-heading">苦戦①InputSystemが動画と違う</h2>



<p>Starter AssetのPlayerオブジェクトは、チュートリアル動画のようにUpdate()の中で入力を取得していません。</p>



<p>具体的には、ThirdPersonController.csで移動を、StarterAssetsInputs.csで入力を取得しています。</p>



<p>なので、この2つのスクリプトをMonoBehaviour→NetworkBehaviourに変更して、IsOwner、IsServerなどで制御する必要があります。</p>



<p>また、動画では古いInputSystem、Starter AssetはUnityの最新のInputSystemを使っています。</p>



<p>この新しいInputSystemには大いに苦しめられることになります。</p>



<h2 class="wp-block-heading">苦戦②Visual Studio CodeがNetcodeをサポートしていない</h2>



<p>バリアント化したプレイヤープレハブのThirdPersonController.cs、StarterAssetsInputs.csをコンポーネント削除をして、Starter Assetのプレハブからスクリプトを自分のところにコピーします。</p>



<p>元の名前と同じだとややこしいので、それぞれ適当にリネームして下さい。<br>（自分は接頭にMyを付けてリネームしました。この辺はお好みでどうぞ。）</p>



<p>そして、Visual Studio Codeでスクリプトを編集するわけですが、Netcode系、新InputSystem系のアセンブリ参照が見つからない問題にぶち当たります。</p>



<figure class="wp-block-image aligncenter size-large"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2021/12/image.png?ssl=1" target="_blank" rel="noopener noreferrer"><img data-recalc-dims="1" loading="lazy" decoding="async" width="984" height="281" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2021/12/image.png?resize=984%2C281&#038;ssl=1" alt="" class="wp-image-1069" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2021/12/image.png?w=984&amp;ssl=1 984w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2021/12/image.png?resize=300%2C86&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2021/12/image.png?resize=768%2C219&amp;ssl=1 768w" sizes="auto, (max-width: 984px) 100vw, 984px" /></a><figcaption class="wp-element-caption">アセンブリ参照が出来ないので、コード補完や定義参照などができなくなる</figcaption></figure>



<p>これに関しては、最後まで解決できませんでしが、Unity側でのコンパイルには問題ないようです。</p>



<p>おそらくVisual Studio Code Editor がそのうち修正されて対応されると思います。</p>



<h2 class="wp-block-heading">苦戦③IsServerの解釈違い</h2>



<p>チュートリアル動画の説明では、難しいところがあったので自分なりに考えて解釈していたところ大はまりしたので、解釈違いを起こしていた部分とその解説を入れたいと思います。</p>



<p>まず理解が必要だと思ったのは、ServerRpcの挙動です。</p>



<p>以下のリンクを見て下さい。</p>



<p>ServerRpc | Unity Multiplayer Networking<br><a href="https://docs-multiplayer.unity3d.com/docs/advanced-topics/message-system/serverrpc/index.html">https://docs-multiplayer.unity3d.com/docs/advanced-topics/message-system/serverrpc/index.html</a></p>



<p>ここの図を見ていただければ口で説明するより分かりやすいと思います。</p>



<p>[Unity.Netcode.ServerRpc]がついたSetMoveInputServerRpc()は、呼び出されたときに直接実行されるわけではなく、リンクの図のように（別のネットワークの）Serverで実行されます。</p>



<p>つまり、ClientでMoveInput()は実行されません。<br>全てServerでMoveInput()が実行されます。</p>



<figure class="wp-block-image aligncenter size-large"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2021/12/image-2.png?ssl=1" target="_blank" rel="noopener noreferrer"><img data-recalc-dims="1" loading="lazy" decoding="async" width="625" height="477" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2021/12/image-2.png?resize=625%2C477&#038;ssl=1" alt="" class="wp-image-1071" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2021/12/image-2.png?w=625&amp;ssl=1 625w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2021/12/image-2.png?resize=300%2C229&amp;ssl=1 300w" sizes="auto, (max-width: 625px) 100vw, 625px" /></a><figcaption class="wp-element-caption">StarterAssetsInputs.csの実例</figcaption></figure>



<p>ここでややこしいと頭を悩ませるのが、このスクリプト自体がServerでも使われ、Clientでも使われることです。</p>



<p>そこで、スクリプトをServer、Clientで分岐させる必要があります。</p>



<p>そのための関連フラグを軽く説明します。</p>



<p>IsOwener：スクリプトが実際に操作しているプレイヤーのものかどうか</p>



<p>マルチ実行中は操作プレイヤーだけでなく、他のプレイヤーもオブジェクトとして同じスクリプトを使って複数生成されます。</p>



<p>そうなると、キーボードなどで操作したい（入力を取得したい）オブジェクトを判別する必要があるので、そのために使われます。</p>



<p>このフラグの管理は、NetworkManagerによって行われます。</p>



<p>IsClient：クライアント⇔サーバーにおけるクライアント側（操作のみ）<br>IsServer：クライアント⇔サーバーにおけるサーバー側（処理の集約と展開）</p>



<p>動画の中では、Host、Clientで説明されるので自分は誤解してしまいましたが、HostとClientは対ではありません。</p>



<p>Hostは、IsServerであり、IsClientでもあります。<br>（自分は最初、HostはIsClientではないと思っていた。）</p>



<p>対になっているのは、ClientとServerであり、HostもまたClient扱いになります。</p>



<p>IsServerを使って、Move()をServer側（Host側）にだけ実行させます。</p>



<p>Client側の移動はどうなるかというと、全てオブジェクトに付けたNetworkTransformによってNetworkManagerにより、まずServerに全て集約され、ネットワーク経由で各々配信され行われます。</p>



<p>この辺りの理解はかなり誤解していました。</p>



<p>苦戦①に関連して、2つのファイルにわたって動画と実装が異なっているので注意して下さい。</p>



<figure class="wp-block-image aligncenter size-large"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2021/12/image-3.png?ssl=1" target="_blank" rel="noopener noreferrer"><img data-recalc-dims="1" loading="lazy" decoding="async" width="982" height="471" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2021/12/image-3.png?resize=982%2C471&#038;ssl=1" alt="" class="wp-image-1072" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2021/12/image-3.png?w=982&amp;ssl=1 982w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2021/12/image-3.png?resize=300%2C144&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2021/12/image-3.png?resize=768%2C368&amp;ssl=1 768w" sizes="auto, (max-width: 982px) 100vw, 982px" /></a><figcaption class="wp-element-caption">ThirdPersonController.csの実例</figcaption></figure>



<h2 class="wp-block-heading">苦戦④新InputSystemの仕様に苦しめられる</h2>



<p>出来たアプリをビルド実行して（ウィンドウ化設定をした方がいい）、HostボタンでPlayerArmatureを作ります。</p>



<p>そして次に、Unityのエミュレーターを実行して、ClientボタンでPleyerArmatureが作られると、Client側ではHostで作られたものと合わせて2つ作成されます。</p>



<p>この時に、PleyerArmatureに設定されているInputSystemは、2つのオブジェクトそれぞれに存在するので、それぞれが操作できるように自動で割り振りを行います。</p>



<p>そうすると、1つ目はキーボードになり、なんと2つ目はXboxコントローラーに割り振られます。</p>



<p>この現象と、Netcodeが必ずHostキャラから生成する仕様と合わさり、Clientボタンで2番目に作成されたPleyerArmatureが操作できないという問題にぶち当たりました。</p>



<p>これには大いに苦しめられました。<br>（操作できない理由にたどり着くまでに紆余曲折がありました<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f62d.png" alt="😭" class="wp-smiley" style="height: 1em; max-height: 1em;" />）</p>



<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://t.co/XOIE5apT2q">https://t.co/XOIE5apT2q</a><br>↑を自分でやってたけど、クライアント側が動かない（単体だと動かせる）。煮詰まってしまった。ちょっと休憩かな。何か間違ってるんだろうなぁ。 <a href="https://t.co/teXJ737mms">pic.twitter.com/teXJ737mms</a></p>&mdash; 藤原工房 (@FujiwaraKoubou) <a href="https://twitter.com/FujiwaraKoubou/status/1466957541288845314?ref_src=twsrc%5Etfw">December 4, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 



<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Netcode現状まとめ<br>新しいInputSystem（PlayerInputManager）に大苦戦中<br>WindowsアプリでHostを起動し、UnityでClientを起動すると、Client側が動かせなくなる。<br>これは、操作Playerが生成されると自動的に操作可能なキーボードを割り振るが、2人目が生成されるとキーボードを禁止するため <a href="https://t.co/A0Ywtk7kWq">pic.twitter.com/A0Ywtk7kWq</a></p>&mdash; 藤原工房 (@FujiwaraKoubou) <a href="https://twitter.com/FujiwaraKoubou/status/1467296057759776770?ref_src=twsrc%5Etfw">December 5, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 



<p>2つ目がXboxコントローラーになる件については、厳密には「操作無効になった状態をXboxとしてデバッグ出力していた」です。</p>



<p>この状態を何とかするために、関係ないオブジェクト（Client側から見たらHost側のオブジェクト）にInputSystemは必要ないので、プレハブのPlayerInputのenabledチェックを外しておいて、スクリプトの中でtrueにすることで解決しました。</p>



<figure class="wp-block-image aligncenter size-large is-resized"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2021/12/image-4.png?ssl=1" target="_blank" rel="noopener noreferrer"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="541" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2021/12/image-4.png?resize=1024%2C541&#038;ssl=1" alt="" class="wp-image-1073" style="width:630px;height:332px" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2021/12/image-4.png?resize=1024%2C541&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2021/12/image-4.png?resize=300%2C159&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2021/12/image-4.png?resize=768%2C406&amp;ssl=1 768w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2021/12/image-4.png?resize=1536%2C812&amp;ssl=1 1536w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2021/12/image-4.png?resize=1200%2C634&amp;ssl=1 1200w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2021/12/image-4.png?w=1917&amp;ssl=1 1917w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /></a><figcaption class="wp-element-caption">最終的なPlayerArmatureのプレハブ設定（バリアント）詳細</figcaption></figure>



<figure class="wp-block-image aligncenter size-large"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2021/12/image-5.png?ssl=1" target="_blank" rel="noopener noreferrer"><img data-recalc-dims="1" loading="lazy" decoding="async" width="961" height="563" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2021/12/image-5.png?resize=961%2C563&#038;ssl=1" alt="" class="wp-image-1074" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2021/12/image-5.png?w=961&amp;ssl=1 961w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2021/12/image-5.png?resize=300%2C176&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2021/12/image-5.png?resize=768%2C450&amp;ssl=1 768w" sizes="auto, (max-width: 961px) 100vw, 961px" /></a><figcaption class="wp-element-caption">GetComponet&lt;PlayerInput&gt;()を追加してInputSystemを呼び出し、Start()内でIsOwnerならtrueにする</figcaption></figure>



<h2 class="wp-block-heading">まとめ</h2>



<p>やった対応自体は、ほんの一握りのことですが、これにたどり着くまでに数十のサイトで調べに調べたので丸一日ぐらいの時間がかかりました。</p>



<p>疲れた。</p>



<p>願わくば、この記事が何かの役に立てばいいな<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f60a.png" alt="😊" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p>ちなみにチュートリアル動画のリレーサーバー以降は、ノーヒント状態なので再現するのは諦めました。</p>The post <a href="https://fujiwarakoubou.jp/2021/12/05/netcode-tutorial-daikusen/">Netcode for GameObjects（旧名MLAPI）のチュートリアルで大苦戦した記録</a> first appeared on <a href="https://fujiwarakoubou.jp">藤原工房</a>.]]></content:encoded>
					
					<wfw:commentRss>https://fujiwarakoubou.jp/2021/12/05/netcode-tutorial-daikusen/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1068</post-id>	</item>
		<item>
		<title>【Unity入門】新しくなったUnity公式チュートリアルを軽く解説</title>
		<link>https://fujiwarakoubou.jp/2020/04/19/unity-tutorial-2020/</link>
					<comments>https://fujiwarakoubou.jp/2020/04/19/unity-tutorial-2020/#respond</comments>
		
		<dc:creator><![CDATA[fujiwarakoubou]]></dc:creator>
		<pubDate>Sun, 19 Apr 2020 06:59:10 +0000</pubDate>
				<category><![CDATA[ゲーム開発]]></category>
		<category><![CDATA[Unity]]></category>
		<guid isPermaLink="false">https://fujiwarakoubou.jp/?p=795</guid>

					<description><![CDATA[<p>ひと昔前までは、Unityの公式チュートリアルといえば以前解説したような、動画形式の簡素なものでしたが、今は新しくチュートリアル専用のサイトとして「Unity Learn」があります。 以前のRoll-a-ballのチュ [&#8230;]</p>
The post <a href="https://fujiwarakoubou.jp/2020/04/19/unity-tutorial-2020/">【Unity入門】新しくなったUnity公式チュートリアルを軽く解説</a> first appeared on <a href="https://fujiwarakoubou.jp">藤原工房</a>.]]></description>
										<content:encoded><![CDATA[<p><a class="a2a_button_hatena" href="https://www.addtoany.com/add_to/hatena?linkurl=https%3A%2F%2Ffujiwarakoubou.jp%2F2020%2F04%2F19%2Funity-tutorial-2020%2F&amp;linkname=%E3%80%90Unity%E5%85%A5%E9%96%80%E3%80%91%E6%96%B0%E3%81%97%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9FUnity%E5%85%AC%E5%BC%8F%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%92%E8%BB%BD%E3%81%8F%E8%A7%A3%E8%AA%AC" title="Hatena" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Ffujiwarakoubou.jp%2F2020%2F04%2F19%2Funity-tutorial-2020%2F&amp;linkname=%E3%80%90Unity%E5%85%A5%E9%96%80%E3%80%91%E6%96%B0%E3%81%97%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9FUnity%E5%85%AC%E5%BC%8F%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%92%E8%BB%BD%E3%81%8F%E8%A7%A3%E8%AA%AC" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Ffujiwarakoubou.jp%2F2020%2F04%2F19%2Funity-tutorial-2020%2F&amp;linkname=%E3%80%90Unity%E5%85%A5%E9%96%80%E3%80%91%E6%96%B0%E3%81%97%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9FUnity%E5%85%AC%E5%BC%8F%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%92%E8%BB%BD%E3%81%8F%E8%A7%A3%E8%AA%AC" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_line" href="https://www.addtoany.com/add_to/line?linkurl=https%3A%2F%2Ffujiwarakoubou.jp%2F2020%2F04%2F19%2Funity-tutorial-2020%2F&amp;linkname=%E3%80%90Unity%E5%85%A5%E9%96%80%E3%80%91%E6%96%B0%E3%81%97%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9FUnity%E5%85%AC%E5%BC%8F%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%92%E8%BB%BD%E3%81%8F%E8%A7%A3%E8%AA%AC" title="Line" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_reddit" href="https://www.addtoany.com/add_to/reddit?linkurl=https%3A%2F%2Ffujiwarakoubou.jp%2F2020%2F04%2F19%2Funity-tutorial-2020%2F&amp;linkname=%E3%80%90Unity%E5%85%A5%E9%96%80%E3%80%91%E6%96%B0%E3%81%97%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9FUnity%E5%85%AC%E5%BC%8F%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%92%E8%BB%BD%E3%81%8F%E8%A7%A3%E8%AA%AC" title="Reddit" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Ffujiwarakoubou.jp%2F2020%2F04%2F19%2Funity-tutorial-2020%2F&amp;linkname=%E3%80%90Unity%E5%85%A5%E9%96%80%E3%80%91%E6%96%B0%E3%81%97%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9FUnity%E5%85%AC%E5%BC%8F%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%92%E8%BB%BD%E3%81%8F%E8%A7%A3%E8%AA%AC" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_pocket" href="https://www.addtoany.com/add_to/pocket?linkurl=https%3A%2F%2Ffujiwarakoubou.jp%2F2020%2F04%2F19%2Funity-tutorial-2020%2F&amp;linkname=%E3%80%90Unity%E5%85%A5%E9%96%80%E3%80%91%E6%96%B0%E3%81%97%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9FUnity%E5%85%AC%E5%BC%8F%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%92%E8%BB%BD%E3%81%8F%E8%A7%A3%E8%AA%AC" title="Pocket" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Ffujiwarakoubou.jp%2F2020%2F04%2F19%2Funity-tutorial-2020%2F&amp;linkname=%E3%80%90Unity%E5%85%A5%E9%96%80%E3%80%91%E6%96%B0%E3%81%97%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9FUnity%E5%85%AC%E5%BC%8F%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%92%E8%BB%BD%E3%81%8F%E8%A7%A3%E8%AA%AC" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_pinterest" href="https://www.addtoany.com/add_to/pinterest?linkurl=https%3A%2F%2Ffujiwarakoubou.jp%2F2020%2F04%2F19%2Funity-tutorial-2020%2F&amp;linkname=%E3%80%90Unity%E5%85%A5%E9%96%80%E3%80%91%E6%96%B0%E3%81%97%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9FUnity%E5%85%AC%E5%BC%8F%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%92%E8%BB%BD%E3%81%8F%E8%A7%A3%E8%AA%AC" title="Pinterest" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Ffujiwarakoubou.jp%2F2020%2F04%2F19%2Funity-tutorial-2020%2F&#038;title=%E3%80%90Unity%E5%85%A5%E9%96%80%E3%80%91%E6%96%B0%E3%81%97%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9FUnity%E5%85%AC%E5%BC%8F%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%92%E8%BB%BD%E3%81%8F%E8%A7%A3%E8%AA%AC" data-a2a-url="https://fujiwarakoubou.jp/2020/04/19/unity-tutorial-2020/" data-a2a-title="【Unity入門】新しくなったUnity公式チュートリアルを軽く解説"></a></p>
<p>ひと昔前までは、Unityの公式チュートリアルといえば以前<a href="https://fujiwarakoubou.jp/2016/12/13/game-developer-complement-by-unity-tutorial-on-roll-a-ball/" class="aioseop-link"><strong>解説</strong></a>したような、動画形式の簡素なものでしたが、今は新しくチュートリアル専用のサイトとして「<a rel="noreferrer noopener" href="https://learn.unity.com/" target="_blank" class="aioseop-link"><strong>Unity Learn</strong></a>」があります。</p>



<div class="wp-block-group is-layout-flow wp-block-group-is-layout-flow">
<p>以前のRoll-a-ballのチュートリアルページは、この「<a rel="noreferrer noopener" href="https://learn.unity.com/" target="_blank" class="aioseop-link"><strong>Unity Learn</strong></a>」に再編されていて古いリンクはこちらのサイトへリダイレクトされるようになっていました。</p>
</div>



<p><a href="https://learn.unity.com/project/roll-a-ball-tutorial?language=en" target="_blank" aria-label=" (opens in a new tab)" rel="noreferrer noopener" class="aioseop-link"><strong>Roll-a-ball &#8211; Unity Learn</strong></a>（英語版）<a href="https://learn.unity.com/project/yu-zhuan-gashi" target="_blank" aria-label=" (opens in a new tab)" rel="noreferrer noopener" class="aioseop-link"><strong>玉転がし &#8211; Unity Learn</strong></a>（日本語版）</p>



<p>で、今回は、この玉転がしの解説ではなく、新しく作られたチュートリアルサイトで初学者が「これってどこから手を付けたらいいの？」「入り口はどこにあるの？」という素朴な疑問を解消するために、サイトでの最初の道筋を解説してみたいと思います。</p>



<span id="more-795"></span>



<h2 class="wp-block-heading">サイトの日本語化</h2>



<p>まず初めに、英語に拒否反応を示す方のために、サイトの日本語化（一部だけ）のやり方を説明します。まずは<a aria-label="トップページ (opens in a new tab)" href="https://learn.unity.com/" target="_blank" rel="noreferrer noopener" class="aioseop-link"><strong>トップページ</strong></a>を開き</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1251" height="900" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2020/04/1.png?fit=660%2C475&amp;ssl=1" alt="" class="wp-image-799" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2020/04/1.png?w=1251&amp;ssl=1 1251w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2020/04/1.png?resize=300%2C216&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2020/04/1.png?resize=1024%2C737&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2020/04/1.png?resize=768%2C553&amp;ssl=1 768w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /><figcaption>Unity Learn トップページ（新型コロナで無償化イベント中）</figcaption></figure></div>



<p>トップページを一番下までスクロールすると、言語指定が出来るところがあります。そこで「日本語」を選択します。</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1335" height="887" src="https://i2.wp.com/fujiwarakoubou.jp/wp-content/uploads/2020/04/3-1.png?fit=660%2C438&amp;ssl=1" alt="" class="wp-image-800" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2020/04/3-1.png?w=1335&amp;ssl=1 1335w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2020/04/3-1.png?resize=300%2C199&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2020/04/3-1.png?resize=1024%2C680&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2020/04/3-1.png?resize=768%2C510&amp;ssl=1 768w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /><figcaption>トップページ一番下の右下「Language English」をクリック</figcaption></figure></div>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1277" height="909" src="https://i2.wp.com/fujiwarakoubou.jp/wp-content/uploads/2020/04/3-2-1.png?fit=660%2C470&amp;ssl=1" alt="" class="wp-image-802" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2020/04/3-2-1.png?w=1277&amp;ssl=1 1277w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2020/04/3-2-1.png?resize=300%2C214&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2020/04/3-2-1.png?resize=1024%2C729&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2020/04/3-2-1.png?resize=768%2C547&amp;ssl=1 768w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /><figcaption>メニュー欄などが日本語化されました</figcaption></figure></div>



<h2 class="wp-block-heading">サイトのログイン</h2>



<p>チュートリアルを始めようとすると「ログインして下さい」的なことを言われるので、まずはアカウント作成とログインについて軽く説明します。</p>



<p>トップページの右上のアイコン（人影の形です）をクリックすると、「Unity ID を作成する」というのがあるので、それをクリックして下さい。</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1267" height="913" src="https://i1.wp.com/fujiwarakoubou.jp/wp-content/uploads/2020/04/1-3.png?fit=660%2C476&amp;ssl=1" alt="" class="wp-image-803" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2020/04/1-3.png?w=1267&amp;ssl=1 1267w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2020/04/1-3.png?resize=300%2C216&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2020/04/1-3.png?resize=1024%2C738&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2020/04/1-3.png?resize=768%2C553&amp;ssl=1 768w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /><figcaption>すでにアカウントを作成済みなら「サインイン」</figcaption></figure></div>



<p>Unity ID はこのサイトだけでなく、この先での Unity Hub や Unity 本体でも使うので、パスワードは忘れないように。掲示板とかに表示される「ユーザーネーム」の設定だけは気を付けた方がいいかもしれません。</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1201" height="795" src="https://i1.wp.com/fujiwarakoubou.jp/wp-content/uploads/2020/04/1-4.png?fit=660%2C437&amp;ssl=1" alt="" class="wp-image-804" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2020/04/1-4.png?w=1201&amp;ssl=1 1201w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2020/04/1-4.png?resize=300%2C199&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2020/04/1-4.png?resize=1024%2C678&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2020/04/1-4.png?resize=768%2C508&amp;ssl=1 768w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /><figcaption>アカウント作成の手順はここでは省略</figcaption></figure></div>



<h2 class="wp-block-heading">Getting Started with Unity という入り口　</h2>



<p>ログイン出来たら、早速チュートリアルを探してみましょう。</p>



<p>まずは、メニュー欄の「コース」をクリック</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1251" height="873" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2020/04/4-1.png?fit=660%2C461&amp;ssl=1" alt="" class="wp-image-805" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2020/04/4-1.png?w=1251&amp;ssl=1 1251w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2020/04/4-1.png?resize=300%2C209&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2020/04/4-1.png?resize=1024%2C715&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2020/04/4-1.png?resize=768%2C536&amp;ssl=1 768w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /><figcaption>プロジェクトやチュートリアルを押したくなるけど、おすすめはコース</figcaption></figure></div>



<p>コースをクリックすると画面中段に「コース」と表示されて、検索欄やタグ、そしてコース一覧が表示されるようになります。</p>



<p>そこで「レベル」タグを「Foundational」にして、絞り込み検索（フィルター）をします。Foundational は「基礎」って意味ですね。</p>



<p>すると、2つのコースが表示されます。その内、右側の「<strong><a href="https://learn.unity.com/course/getting-started-with-unity" target="_blank" aria-label="Getting Started with Unity (opens in a new tab)" rel="noreferrer noopener" class="aioseop-link">Getting Started with Unity</a></strong>」がどうやら Unity 入門コースになっているようです。こんなやや小難しい手順を踏まないといけないのは「どうなんだろ？」と思いますが、おそらくこれが初学者の入り口かと思います。</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1270" height="905" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2020/04/4-2.png?fit=660%2C471&amp;ssl=1" alt="" class="wp-image-806" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2020/04/4-2.png?w=1270&amp;ssl=1 1270w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2020/04/4-2.png?resize=300%2C214&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2020/04/4-2.png?resize=1024%2C730&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2020/04/4-2.png?resize=768%2C547&amp;ssl=1 768w" sizes="auto, (max-width: 1000px) 100vw, 1000px" /><figcaption>初学者だと「迷う」よね、たぶん</figcaption></figure></div>The post <a href="https://fujiwarakoubou.jp/2020/04/19/unity-tutorial-2020/">【Unity入門】新しくなったUnity公式チュートリアルを軽く解説</a> first appeared on <a href="https://fujiwarakoubou.jp">藤原工房</a>.]]></content:encoded>
					
					<wfw:commentRss>https://fujiwarakoubou.jp/2020/04/19/unity-tutorial-2020/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">795</post-id>	</item>
		<item>
		<title>ゲーム開発者が補足するUnity公式チュートリアル～Roll-a-ball編～</title>
		<link>https://fujiwarakoubou.jp/2016/12/13/game-developer-complement-by-unity-tutorial-on-roll-a-ball/</link>
					<comments>https://fujiwarakoubou.jp/2016/12/13/game-developer-complement-by-unity-tutorial-on-roll-a-ball/#respond</comments>
		
		<dc:creator><![CDATA[fujiwarakoubou]]></dc:creator>
		<pubDate>Tue, 13 Dec 2016 03:47:37 +0000</pubDate>
				<category><![CDATA[ゲーム開発]]></category>
		<category><![CDATA[Unity]]></category>
		<guid isPermaLink="false">http://fujiwarakoubou.jp/?p=113</guid>

					<description><![CDATA[<p>Unity は優れたゲーム開発ツールですが、Unity 公式チュートリアル内容は英語で、しかもゲーム開発者には馴染みが深くとも業界初心者には難解な部分が結構あります。そこで、チュートリアルを噛み砕いて少しでも分かりやすく [&#8230;]</p>
The post <a href="https://fujiwarakoubou.jp/2016/12/13/game-developer-complement-by-unity-tutorial-on-roll-a-ball/">ゲーム開発者が補足するUnity公式チュートリアル～Roll-a-ball編～</a> first appeared on <a href="https://fujiwarakoubou.jp">藤原工房</a>.]]></description>
										<content:encoded><![CDATA[<p><a class="a2a_button_hatena" href="https://www.addtoany.com/add_to/hatena?linkurl=https%3A%2F%2Ffujiwarakoubou.jp%2F2016%2F12%2F13%2Fgame-developer-complement-by-unity-tutorial-on-roll-a-ball%2F&amp;linkname=%E3%82%B2%E3%83%BC%E3%83%A0%E9%96%8B%E7%99%BA%E8%80%85%E3%81%8C%E8%A3%9C%E8%B6%B3%E3%81%99%E3%82%8BUnity%E5%85%AC%E5%BC%8F%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%EF%BD%9ERoll-a-ball%E7%B7%A8%EF%BD%9E" title="Hatena" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Ffujiwarakoubou.jp%2F2016%2F12%2F13%2Fgame-developer-complement-by-unity-tutorial-on-roll-a-ball%2F&amp;linkname=%E3%82%B2%E3%83%BC%E3%83%A0%E9%96%8B%E7%99%BA%E8%80%85%E3%81%8C%E8%A3%9C%E8%B6%B3%E3%81%99%E3%82%8BUnity%E5%85%AC%E5%BC%8F%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%EF%BD%9ERoll-a-ball%E7%B7%A8%EF%BD%9E" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Ffujiwarakoubou.jp%2F2016%2F12%2F13%2Fgame-developer-complement-by-unity-tutorial-on-roll-a-ball%2F&amp;linkname=%E3%82%B2%E3%83%BC%E3%83%A0%E9%96%8B%E7%99%BA%E8%80%85%E3%81%8C%E8%A3%9C%E8%B6%B3%E3%81%99%E3%82%8BUnity%E5%85%AC%E5%BC%8F%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%EF%BD%9ERoll-a-ball%E7%B7%A8%EF%BD%9E" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_line" href="https://www.addtoany.com/add_to/line?linkurl=https%3A%2F%2Ffujiwarakoubou.jp%2F2016%2F12%2F13%2Fgame-developer-complement-by-unity-tutorial-on-roll-a-ball%2F&amp;linkname=%E3%82%B2%E3%83%BC%E3%83%A0%E9%96%8B%E7%99%BA%E8%80%85%E3%81%8C%E8%A3%9C%E8%B6%B3%E3%81%99%E3%82%8BUnity%E5%85%AC%E5%BC%8F%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%EF%BD%9ERoll-a-ball%E7%B7%A8%EF%BD%9E" title="Line" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_reddit" href="https://www.addtoany.com/add_to/reddit?linkurl=https%3A%2F%2Ffujiwarakoubou.jp%2F2016%2F12%2F13%2Fgame-developer-complement-by-unity-tutorial-on-roll-a-ball%2F&amp;linkname=%E3%82%B2%E3%83%BC%E3%83%A0%E9%96%8B%E7%99%BA%E8%80%85%E3%81%8C%E8%A3%9C%E8%B6%B3%E3%81%99%E3%82%8BUnity%E5%85%AC%E5%BC%8F%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%EF%BD%9ERoll-a-ball%E7%B7%A8%EF%BD%9E" title="Reddit" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Ffujiwarakoubou.jp%2F2016%2F12%2F13%2Fgame-developer-complement-by-unity-tutorial-on-roll-a-ball%2F&amp;linkname=%E3%82%B2%E3%83%BC%E3%83%A0%E9%96%8B%E7%99%BA%E8%80%85%E3%81%8C%E8%A3%9C%E8%B6%B3%E3%81%99%E3%82%8BUnity%E5%85%AC%E5%BC%8F%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%EF%BD%9ERoll-a-ball%E7%B7%A8%EF%BD%9E" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_pocket" href="https://www.addtoany.com/add_to/pocket?linkurl=https%3A%2F%2Ffujiwarakoubou.jp%2F2016%2F12%2F13%2Fgame-developer-complement-by-unity-tutorial-on-roll-a-ball%2F&amp;linkname=%E3%82%B2%E3%83%BC%E3%83%A0%E9%96%8B%E7%99%BA%E8%80%85%E3%81%8C%E8%A3%9C%E8%B6%B3%E3%81%99%E3%82%8BUnity%E5%85%AC%E5%BC%8F%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%EF%BD%9ERoll-a-ball%E7%B7%A8%EF%BD%9E" title="Pocket" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Ffujiwarakoubou.jp%2F2016%2F12%2F13%2Fgame-developer-complement-by-unity-tutorial-on-roll-a-ball%2F&amp;linkname=%E3%82%B2%E3%83%BC%E3%83%A0%E9%96%8B%E7%99%BA%E8%80%85%E3%81%8C%E8%A3%9C%E8%B6%B3%E3%81%99%E3%82%8BUnity%E5%85%AC%E5%BC%8F%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%EF%BD%9ERoll-a-ball%E7%B7%A8%EF%BD%9E" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_pinterest" href="https://www.addtoany.com/add_to/pinterest?linkurl=https%3A%2F%2Ffujiwarakoubou.jp%2F2016%2F12%2F13%2Fgame-developer-complement-by-unity-tutorial-on-roll-a-ball%2F&amp;linkname=%E3%82%B2%E3%83%BC%E3%83%A0%E9%96%8B%E7%99%BA%E8%80%85%E3%81%8C%E8%A3%9C%E8%B6%B3%E3%81%99%E3%82%8BUnity%E5%85%AC%E5%BC%8F%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%EF%BD%9ERoll-a-ball%E7%B7%A8%EF%BD%9E" title="Pinterest" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Ffujiwarakoubou.jp%2F2016%2F12%2F13%2Fgame-developer-complement-by-unity-tutorial-on-roll-a-ball%2F&#038;title=%E3%82%B2%E3%83%BC%E3%83%A0%E9%96%8B%E7%99%BA%E8%80%85%E3%81%8C%E8%A3%9C%E8%B6%B3%E3%81%99%E3%82%8BUnity%E5%85%AC%E5%BC%8F%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%EF%BD%9ERoll-a-ball%E7%B7%A8%EF%BD%9E" data-a2a-url="https://fujiwarakoubou.jp/2016/12/13/game-developer-complement-by-unity-tutorial-on-roll-a-ball/" data-a2a-title="ゲーム開発者が補足するUnity公式チュートリアル～Roll-a-ball編～"></a></p>
<p>Unity は優れたゲーム開発ツールですが、Unity 公式チュートリアル内容は英語で、しかもゲーム開発者には馴染みが深くとも業界初心者には難解な部分が結構あります。そこで、チュートリアルを噛み砕いて少しでも分かりやすく解説を追加してみようと思います。自分はプログラマですが Unity は初心者なので、この記事によって自身の復習としたいです。</p>



<p>この記事は以下の環境で開発しています。<br>Windows10<br>Visual Studio Community 2015<br>Unity 5.5.0f3</p>



<p>同じ環境を構築する場合は、Visual Studio をインストールした後にUnityをインストールするべきです。そうすることで、Unityインストール時に、Visual Studio に Unity 用プロジェクト設定が追加されると思います。</p>



<p>では、さっそく解説していきます。<br>内容は全翻訳ではなく、あくまで補足という形になりますのでご注意ください。</p>



<span id="more-113"></span>



<h2 class="wp-block-heading">1. Environment and Player</h2>



<h3 class="wp-block-heading">01. Setting up the Game</h3>



<h4 class="wp-block-heading"><span style="color: #ff6600;">00:39　新規プロジェクト作成</span></h4>



<p>5.5では新規プロジェクトの表示画面がかなり変わっていたので念のため補足しておきます。</p>



<p class="has-text-align-center">チュートリアルの表示</p>



<figure class="wp-block-image aligncenter"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/57085a3b6931d41bf6ea27ae0e0b34c3.png"><img data-recalc-dims="1" loading="lazy" decoding="async" width="300" height="169" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/57085a3b6931d41bf6ea27ae0e0b34c3-300x169.png?resize=300%2C169" alt="" class="wp-image-116" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/57085a3b6931d41bf6ea27ae0e0b34c3.png?resize=300%2C169&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/57085a3b6931d41bf6ea27ae0e0b34c3.png?resize=768%2C432&amp;ssl=1 768w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/57085a3b6931d41bf6ea27ae0e0b34c3.png?resize=1024%2C576&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/57085a3b6931d41bf6ea27ae0e0b34c3.png?w=1097&amp;ssl=1 1097w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></figure>



<p class="has-text-align-center">Unity 5.5の表示（2段階）</p>



<figure class="wp-block-image aligncenter"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/f847cc8988d068c797223108904d245d.png"><img data-recalc-dims="1" loading="lazy" decoding="async" width="300" height="173" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/f847cc8988d068c797223108904d245d-300x173.png?resize=300%2C173" alt="" class="wp-image-114" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/f847cc8988d068c797223108904d245d.png?resize=300%2C173&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/f847cc8988d068c797223108904d245d.png?resize=768%2C442&amp;ssl=1 768w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/f847cc8988d068c797223108904d245d.png?w=1002&amp;ssl=1 1002w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></figure>



<figure class="wp-block-image aligncenter"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/cdd0a77d2d213b91403ad2b019afa84b.png"><img data-recalc-dims="1" loading="lazy" decoding="async" width="300" height="173" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/cdd0a77d2d213b91403ad2b019afa84b-300x173.png?resize=300%2C173" alt="" class="wp-image-115" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/cdd0a77d2d213b91403ad2b019afa84b.png?resize=300%2C173&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/cdd0a77d2d213b91403ad2b019afa84b.png?resize=768%2C442&amp;ssl=1 768w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/cdd0a77d2d213b91403ad2b019afa84b.png?w=1002&amp;ssl=1 1002w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></figure>



<p><span style="color: #ff0000;"><strong>Enable Unity Analytics</strong></span> は「ゲームがどれくらい遊ばれているか」を解析できる機能です。<br>デフォルトONになっていますが気にせずこのままでも大丈夫です。</p>



<p>指定した Location （保存場所）に、指定した Project name のフォルダーが作られてゲームプロジェクトが保存されます。</p>



<p>Organization は Unity に登録したアカウントを使います。<br>逆に言えば、アカウントを登録しないと Unity を使うことはできません。</p>



<p>Unity 初回インストール時にアカウント登録とライセンス登録とがあります。<br>無料の Personal ライセンス登録の選択肢は上から以下のようになっています。</p>



<p>The company or organization I represent earned more than $100,000 in gross revenue in the previous fiscal year.<br>私が代表する会社または組織は、前年度の総収益が10万ドル以上でした。</p>



<p>The company or organization I represent earned less than $100,000 in gross revenue in the previous fiscal year.<br>私が代表する会社または組織は、前年度の総収益が10万ドル未満でした。</p>



<p>I don&#8217;t use Unity in a professional capacity.<br>私はプロの立場でUnityを使用しません。</p>



<p>10万ドル以上の収益がある場合は Personal を使うことができません。<br>個人開発者であれば、ほとんどの人が2つ目の選択肢を選ぶことになるでしょう。<br>3つ目の選択肢は、いわゆる学生、アカデミーでの利用を意味します。</p>



<p class="has-text-align-center">ライセンスの選択画面</p>



<figure class="wp-block-image aligncenter"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/2239856d9e337c96f18860af594d68e0.png"><img data-recalc-dims="1" loading="lazy" decoding="async" width="300" height="172" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/2239856d9e337c96f18860af594d68e0-300x172.png?resize=300%2C172" alt="" class="wp-image-313" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/2239856d9e337c96f18860af594d68e0.png?resize=300%2C172&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/2239856d9e337c96f18860af594d68e0.png?resize=768%2C441&amp;ssl=1 768w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/2239856d9e337c96f18860af594d68e0.png?w=1002&amp;ssl=1 1002w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></figure>



<h4 class="wp-block-heading"><span style="color: #ff6600;">01:03　シーンの保存</span></h4>



<p>シーンを保存する解説で「<em>Scenes」とする場面がありますが、これは別にアンダースコア（</em>←これのこと）を付ける必要はありません。<br>解説者は、「アンダースコアを付けるとフォルダーの並びで先頭に来るから」と言っている通り、Scenes フォルダ並びだけの問題なので、付けないと不味いというわけではありません。</p>



<p class="has-text-align-center">_Scenes</p>



<figure class="wp-block-image aligncenter"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/f3339d5f9297cb491dcd86f71b6d94c2.png"><img data-recalc-dims="1" loading="lazy" decoding="async" width="300" height="168" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/f3339d5f9297cb491dcd86f71b6d94c2-300x168.png?resize=300%2C168" alt="" class="wp-image-118" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/f3339d5f9297cb491dcd86f71b6d94c2.png?resize=300%2C168&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/f3339d5f9297cb491dcd86f71b6d94c2.png?resize=768%2C431&amp;ssl=1 768w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/f3339d5f9297cb491dcd86f71b6d94c2.png?resize=1024%2C575&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/f3339d5f9297cb491dcd86f71b6d94c2.png?w=1095&amp;ssl=1 1095w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></figure>



<h4 class="wp-block-heading"><span style="color: #ff6600;">01:49　3D Object のリネーム</span></h4>



<p>3D Object を作成して名前を変更する場面、Windows10 ではシングルクリックで少し待つか、F2キーを押して変更します。<br>F2キーはファイル名の変更や、Excelの入力内容の変更など、Windows 上の様々な場面で押すキーなので変更キーとして覚えておくといいでしょう。</p>



<p class="has-text-align-center">名前の変更</p>



<figure class="wp-block-image aligncenter"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/a800655ebdf7778f9abe1522cea3e4e6.png"><img data-recalc-dims="1" loading="lazy" decoding="async" width="300" height="169" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/a800655ebdf7778f9abe1522cea3e4e6-300x169.png?resize=300%2C169" alt="" class="wp-image-119" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/a800655ebdf7778f9abe1522cea3e4e6.png?resize=300%2C169&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/a800655ebdf7778f9abe1522cea3e4e6.png?resize=768%2C432&amp;ssl=1 768w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/a800655ebdf7778f9abe1522cea3e4e6.png?resize=1024%2C576&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/a800655ebdf7778f9abe1522cea3e4e6.png?w=1096&amp;ssl=1 1096w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></figure>



<h3 class="wp-block-heading">02. Moving the Player</h3>



<h4 class="wp-block-heading"><span style="color: #ff6600;">01:13　コンポーネントの並び</span></h4>



<p>Sphere Collider （球体の当たり判定）を Rigidbody （物理演算エンジン）の下に並び替える場面がありますが、これは <strong><span style="color: #ff0000;">Unity のシステムが</span><span style="color: #ff0000;">コンポーネントを上から順に実行している</span></strong>ことを解説しています。</p>



<p>これは、Script (プログラム）を実行するときに、頭の片隅に入れておかなければいけない規則で、例えば、Script 内で当たり判定を使う場合、Collider コンポーネントをその Script よりも手前（上）に配置しなければ使うことができません。</p>



<p>Script が思うように動かない場合、この並びが間違っていることがあります。Script コンポーネント同士でも順序によって結果が変わるので気を付けなければなりません。</p>



<p class="has-text-align-center">コンポーネントは上から順に実行される</p>



<figure class="wp-block-image aligncenter"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/7bf3c20cd8c8837967e982ffb2488be4.png"><img data-recalc-dims="1" loading="lazy" decoding="async" width="300" height="168" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/7bf3c20cd8c8837967e982ffb2488be4-300x168.png?resize=300%2C168" alt="" class="wp-image-120" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/7bf3c20cd8c8837967e982ffb2488be4.png?resize=300%2C168&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/7bf3c20cd8c8837967e982ffb2488be4.png?resize=768%2C431&amp;ssl=1 768w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/7bf3c20cd8c8837967e982ffb2488be4.png?resize=1024%2C574&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/7bf3c20cd8c8837967e982ffb2488be4.png?w=1095&amp;ssl=1 1095w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></figure>



<h4 class="wp-block-heading"><span style="color: #ff6600;">03:53　Script のプログラミング</span></h4>



<p>Unity は物を動かしたりするために、Script コンポーネントを使います。<br>この Script は、Javascript 言語か、C# 言語によってプログラミングされます。</p>



<p><strong>Javascript</strong></p>



<p>Internet Explore、Microsoft Edge、Google Chrome、Firefox などインターネットブラウザなどで主に利用されているプログラミング言語</p>



<p>プログラムされた内容をそのまま逐次実行する動的言語と呼ばれる言語で、処理速度が遅い反面、書いた内容を即実行できるお手軽さがあります。</p>



<p><strong>C#</strong></p>



<p>「Java は著作権問題があるから自分たちで新たに言語を作る」という感じで誕生した Microsoft が C 言語を元に、Java 言語を参考にして作ったプログラミング言語</p>



<p>プログラムされた内容は、コンパイルという機械語に変換作業が行われるので、即実行はできない反面、処理速度は速いという面があります。</p>



<p><strong><span style="color: #ff0000;">特別な理由が無い限り、C# で Script をプログラムすることをおすすめします。</span></strong><br>Javascript は処理速度よりも、Visual Studio などのプログラミング開発ツールで「コード補完」が難しいという難点があります。</p>



<p><strong>コード補完</strong></p>



<p>Visual Studio などプログラミングを支援するツール上で、プログラムを書き込んでいるときに、漢字変換のように<span style="color: #ff0000;"><strong>コンピューターが入力したい文字を予測して、候補を表示してくれる機能</strong></span>です。</p>



<p>下の図では、「Ga」とだけ入力したときに、その下に「GameObject」「gameObject」と候補と、その簡易解説が左に表示されています。これがコード補完機能です。<br><strong><span style="color: #ff0000;">これが出来るのと出来ないのとでは、プログラミング速度や楽さが全然違ってきます。</span></strong><br>ちなみに、これでリターンを押すと、「Ga」は「GameObject」に自動変換され入力されます。</p>



<p class="has-text-align-center">Visual Studio でのコード補完</p>



<figure class="wp-block-image aligncenter"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/8f298f1d738c0da3917862f8af5afe75.png"><img data-recalc-dims="1" loading="lazy" decoding="async" width="300" height="174" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/8f298f1d738c0da3917862f8af5afe75-300x174.png?resize=300%2C174" alt="" class="wp-image-123" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/8f298f1d738c0da3917862f8af5afe75.png?resize=300%2C174&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/8f298f1d738c0da3917862f8af5afe75.png?resize=768%2C445&amp;ssl=1 768w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/8f298f1d738c0da3917862f8af5afe75.png?w=1010&amp;ssl=1 1010w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></figure>



<p>ついでに、この上の図のコード内容について解説をします。<br>Unity を使いたいユーザーの大半は、このプログラムコードが意味不明で拒絶反応を起こしてしまうのではないかと思いますので、この解説で意味をイメージしてもらえれば幸いです。</p>



<p><strong>ネームスペース（名前空間）</strong></p>



<pre class="wp-block-preformatted"><pre class="brush: csharp; title: ; notranslate">
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
</pre></pre>



<p>一番上に、「using」に続いて何か英単語が並んでいますが、これは「<strong><span style="color: #ff0000;">ネームスペース（namespace）を利用します</span></strong>」という宣言です。<br>ネームスペースとは、プログラムファイルの集合体につけた総称で、「using UnityEngine」で言えば、UnityEngine という名のプログラム群です。</p>



<p class="has-text-align-center">ネームスペースのイメージ<br>UnityEngine</p>



<figure class="wp-block-image aligncenter"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/company_character2_wakai.png"><img data-recalc-dims="1" loading="lazy" decoding="async" width="150" height="150" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/company_character2_wakai-150x150.png?resize=150%2C150" alt="" class="wp-image-131" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/company_character2_wakai.png?resize=150%2C150&amp;ssl=1 150w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/company_character2_wakai.png?zoom=2&amp;resize=150%2C150&amp;ssl=1 300w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a></figure>



<p class="has-text-align-center">ネームスペースの中にいるプログラムたちのイメージ</p>



<figure class="wp-block-image aligncenter"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/job_roudousya_young.png"><img data-recalc-dims="1" loading="lazy" decoding="async" width="150" height="150" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/job_roudousya_young-150x150.png?resize=150%2C150" alt="" class="wp-image-132" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/job_roudousya_young.png?resize=150%2C150&amp;ssl=1 150w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/job_roudousya_young.png?zoom=2&amp;resize=150%2C150&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/job_roudousya_young.png?zoom=3&amp;resize=150%2C150&amp;ssl=1 450w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a></figure>



<p>UnityEngine というプログラム達が実際どこにいるかという設定は、Visual Studio ではプロジェクトの参照というところで見ることができます。<br>Unity から Script を開けば、自動的にネームスペースやコンパイル設定などを行った状態のプロジェクトが開くので、細かい設定は気にしなくても大丈夫です。</p>



<p class="has-text-align-center">UnityEngine のネームスペースのファイル設定など<br>D:\Unity\Roll a Ball\Library\UnityAssemblies\UnityEngine.dll</p>



<figure class="wp-block-image aligncenter"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/UnityEngine.png"><img data-recalc-dims="1" loading="lazy" decoding="async" width="300" height="140" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/UnityEngine-300x140.png?resize=300%2C140" alt="" class="wp-image-148" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/UnityEngine.png?resize=300%2C140&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/UnityEngine.png?resize=768%2C359&amp;ssl=1 768w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/UnityEngine.png?resize=1024%2C478&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/UnityEngine.png?w=1463&amp;ssl=1 1463w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></figure>



<p>ちなみに、Visual Studio のコード補完の図では、「using System.Collection」と「using System.Collection.Generic」が灰色になっていますが、これはこれらのライブラリを現在このプログラム内で使っていないので、「必要ないですよ」と色で表現してくれています。</p>



<p>このようなプログラム全体を解析して、不要な所であったり、エラーだと思われる部分を表示してくれるのは、Visual Studio などのプログラミング開発ツールの強みです。</p>



<p><strong>クラス（class）</strong></p>



<pre class="wp-block-preformatted"><pre class="brush: csharp; title: ; notranslate">
public class Test : MonoBehaviour {

}
</pre></pre>



<p>この部分は「{」から「}」までの部分が、「Test」という名前の、参照可能なクラス（public class）であることを示しています。</p>



<p>クラスについては、オブジェクト指向というプログラミングの独特な考え方などを理解しないといけない難解な概念なので、ここでは詳細を省きます。<br><span style="color: #ff0000;"><strong>このクラスが、プログラムファイルひとつひとつの単位みたいなものです。</strong></span><br><span style="color: #ff0000;"><strong>このクラスがたくさん集まって、ひとつのネームスペースになります。</strong></span></p>



<p>「: MonoBehaviour」は「<strong><span style="color: #ff0000;">MonoBehaviour というクラスを継承しています</span></strong>」という宣言です。<br>継承についてもオブジェクト指向なので、砕いて説明すると「MonoBehaviour が持っている技を使えるようにします」という感じです。</p>



<p class="has-text-align-center">MonoBehaviour クラスを継承する Test クラスのイメージ</p>



<figure class="wp-block-image aligncenter"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/job_syokugyou_taiken_boy.png"><img data-recalc-dims="1" loading="lazy" decoding="async" width="274" height="300" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/job_syokugyou_taiken_boy-274x300.png?resize=274%2C300" alt="" class="wp-image-133" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/job_syokugyou_taiken_boy.png?resize=274%2C300&amp;ssl=1 274w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/job_syokugyou_taiken_boy.png?w=411&amp;ssl=1 411w" sizes="auto, (max-width: 274px) 100vw, 274px" /></a></figure>



<p>ちなみに、宣言とは誰にしているのかというと、相手はコンピューターです。<br>「MonoBehaviour 使います」とコードで書くことで、Visual Studio が MonoBehaviour のプログラムをコンパイルしたり、コード補完を支援できるようになったりします。</p>



<p><strong>メソッド（関数＝ファンクション）とコメント</strong></p>



<pre class="wp-block-preformatted"><pre class="brush: csharp; title: ; notranslate">
	// Use this for initialization
	void Start () {

	}

	// Update is called once per frame
	void Update () {

	}
</pre></pre>



<p>クラスの中身についての解説です。<br>「void Start ()」はメソッドです。<br>クラスがプログラムファイルの単位だとすれば、<strong><span style="color: #ff0000;">メソッドはファイル内にある個々のプログラム本体と言えます。</span></strong><br>「()」が付くことでメソッドであることを宣言しています。<br>また、Start メソッドは MonoBehaviour クラスにあるメソッドで、それを使っています。</p>



<p><strong><span style="color: #ff0000;">「//」が付いている行はコメントです。コメントはプログラム対象から除外されます。</span></strong><br>「// Use this for initialization」は「void Start ()」に対してのコメントで、「この下のプログラムは初期化のために使います」と説明書きがされています。</p>



<p>Visual Studio でコメントにしたい所は、<span style="color: #ff0000;"><strong>Ctrl + K、Ctrl + C</strong></span> と2回入力、逆にコメントを解除したい行は、<strong><span style="color: #ff0000;">Ctrl + K、Ctrl + U</span></strong> と2回入力します。</p>



<p>余談<br>Visual Studio がイケてないと思う理由の1つに、このショートカットキーを2回入力させる問題があります。<br>他のイケてる開発ツールとかだと、Ctrl + / でコメントにして、コメントになっているところで Ctrl + / とすればコメントを解除できるといった感じで、Microsoft は、もっとスマートにショートカットキーを設定するべきだと思います。</p>



<p><strong>メソッドの入力（引数）</strong></p>



<p><strong><span style="color: #ff0000;">この()の間には、メソッドの入力値が設定できます。<br></span></strong>Start メソッドのカッコ内に何も書いてないので入力値は無いということになります。<br>例えば、整数値（int）の入力（inputという名前）がある場合は、以下のように記述します。</p>



<pre class="wp-block-preformatted"><pre class="brush: csharp; title: ; notranslate">
void Start (int input) {
}
</pre></pre>



<p><strong>メソッドの出力（返値）</strong></p>



<p><strong><span style="color: #ff0000;">void は、</span><span style="color: #ff0000;">このメソッドの出力値が void である、つまり空であることを宣言しています。</span></strong><br>int Start () であれば、int の出力値、つまり整数の出力値が、<br>float Start () であれば、float の出力値、つまり小数点の出力値が、<br>といった感じになります。</p>



<p>void でなければ、Start メソッド内に出力値を設定する「return」を加える必要があります。</p>



<pre class="wp-block-preformatted"><pre class="brush: csharp; title: ; notranslate">
int Start () {
	return 0;
}

float Start () {
	return 0.0f;
}
</pre></pre>



<p>といった感じです。<br>ちなみにセミコロン（;）は、プログラムのひとつの処理を区別するために文末に付けます。<br>文章の句点みたいなものです。</p>



<p>余談<br>Java 言語では同じ内容を以下のように記述します。<br>「using」が「import」、「:」が「extends」に変わっただけです。<br>C# が Java によく似ているのが分かると思います。</p>



<pre class="wp-block-preformatted"><pre class="brush: java; title: ; notranslate">
import System.Collections;
import System.Collections.Generic;
import UnityEngine;

public class Test extends MonoBehaviour {

	// Use this for initialization
	void Start () {

	}

	// Update is called once per frame
	void Update () {

	}
}
</pre></pre>



<p>長くなりましたが、プログラミングコードの意味不明な部分について、少しは理解できたでしょうか。プログラムは、短い文字や記号とルールによって、非常に深い意味をコードに持たせています。これは入力量を減らすためにやっていることで、覚えるまでが大変です。</p>



<h4 class="wp-block-heading"><span style="color: #ff6600;"><strong>04:26　Script のライフサイクル</strong></span></h4>



<p>動画で PlayerController という Script を作成し、その編集を行う場面で、Update と FixedUpdate という2つのメソッドが作成されますが、これについて Unity とどんな関係性があるのかを解説します。</p>



<p>そのためには、まず Unity がどういった流れで動いているかを知る必要があります。<br>下の図は、その流れの一部、Script のライフサイクルを表したものです。</p>



<p class="has-text-align-center">Script のライフサイクル（Script Lifecycle Flowchart）</p>



<figure class="wp-block-image aligncenter"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/46a1657cde0cd05e2367e6fba09abab6.png"><img data-recalc-dims="1" loading="lazy" decoding="async" width="718" height="1024" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/46a1657cde0cd05e2367e6fba09abab6-718x1024.png?resize=718%2C1024" alt="" class="wp-image-153" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/46a1657cde0cd05e2367e6fba09abab6.png?resize=718%2C1024&amp;ssl=1 718w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/46a1657cde0cd05e2367e6fba09abab6.png?resize=210%2C300&amp;ssl=1 210w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/46a1657cde0cd05e2367e6fba09abab6.png?resize=768%2C1096&amp;ssl=1 768w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/46a1657cde0cd05e2367e6fba09abab6.png?w=987&amp;ssl=1 987w" sizes="auto, (max-width: 718px) 100vw, 718px" /></a></figure>



<p>これは <span style="color: #ff0000;"><strong>Unity の Script コンポーネント単体の処理の流れ</strong></span>です。<br>実際ゲームを動かすとき Unity は、シーンの持つ各オブジェクト＞オブジェクトの持つ各コンポーネント、といった感じに関連するものを順番に処理していきます。</p>



<p>例えば PlayerController は、Player オブジェクトの処理の順番が回ってきて、コンポーネントを順番に、Transform、Sphere (Mesh Filter)、Mesh Renderer、Rigidbody、Sphere Collider、と実行されて行って、そして PlayerController (Script) で上の図のような処理が実行されます。<br>それが終わったら、他のオブジェクト、そのオブジェクトのコンポーネント、といった感じに流れて行って、全部のオブジェクトが終わったら、また最初からやり直します。</p>



<p>このループを繰り返すことで、実際のゲーム画面が動いているわけです。<br>この1つのループのことを、1フレームと言います。</p>



<p>さて、このライフサイクルは MonoBehaviour クラスの中に既にプログラムされています。<br>PlayerController は MonoBehaviour を継承して作成されます。<br>そうすると、PlayerController は上の図をプログラムしなくても言いわけです。<br><span style="color: #ff0000;"><strong>Update と FixedUpdate しかプログラムしなくても、実際は見えないところで上の図のプログラムが実行されているわけです。</strong></span></p>



<p>そして、PlayerController に Update と FixedUpdate メソッドを書くことで、MonoBehaviourの Update、FixedUpdate が実行されたときに、一緒に PlayerController の物も追加で実行されるというわけです。</p>



<p>ちなみに、Start は Script で最初の1度だけ実行され、FixedUpdate は物理演算が実行されたときに呼び出され、Update は Script が実行されたときに毎回実行されます。<br>そのため、動画内では Update を消して FixedUpdate を使うという形になります。</p>



<p>この Script のライフサイクルは、他のゲームエンジンなどでも一般的な処理の流れです。<br>ほとんどのゲームプログラムは、入力検知、動作処理、描画を1フレームとして無限ループによって成り立っていることを覚えておくといいでしょう。</p>



<h4 class="wp-block-heading"><span style="color: #ff6600;">05:03　クラス、メソッドのヘルプの呼び出し</span></h4>



<p>Input というクラスが、一体どういった構成なのか知りたいときには、APIと呼ばれる、プログラムの構成情報に特化した書式のヘルプを呼び出します。</p>



<p>Visual Studio では検索したい単語を選択状態にしてから、 <strong><span style="color: #ff0000;">Ctrl + Alt + M 、Ctrl + H </span></strong>と2回ショートカットキーを入力します。</p>



<p class="has-text-align-center">動画内ではブラウザで表示</p>



<figure class="wp-block-image aligncenter"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/ca0f00c00657100ba81e4520991267a5.png"><img data-recalc-dims="1" loading="lazy" decoding="async" width="300" height="169" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/ca0f00c00657100ba81e4520991267a5-300x169.png?resize=300%2C169" alt="" class="wp-image-126" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/ca0f00c00657100ba81e4520991267a5.png?resize=300%2C169&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/ca0f00c00657100ba81e4520991267a5.png?resize=768%2C431&amp;ssl=1 768w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/ca0f00c00657100ba81e4520991267a5.png?resize=1024%2C575&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/ca0f00c00657100ba81e4520991267a5.png?w=1093&amp;ssl=1 1093w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></figure>



<p class="has-text-align-center">Visual Studio ではタブ内に表示</p>



<figure class="wp-block-image aligncenter"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/ccd4c3d38b7438b8efc2806750b861e0.png"><img data-recalc-dims="1" loading="lazy" decoding="async" width="300" height="146" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/ccd4c3d38b7438b8efc2806750b861e0-300x146.png?resize=300%2C146" alt="" class="wp-image-127" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/ccd4c3d38b7438b8efc2806750b861e0.png?resize=300%2C146&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/ccd4c3d38b7438b8efc2806750b861e0.png?resize=768%2C375&amp;ssl=1 768w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/ccd4c3d38b7438b8efc2806750b861e0.png?resize=1024%2C500&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/ccd4c3d38b7438b8efc2806750b861e0.png?w=1340&amp;ssl=1 1340w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></figure>



<p><strong><span style="color: #ff0000;">Description</span> </strong>は、このクラスがどういった構成がされているかという<strong><span style="color: #ff0000;">大まかな概要</span></strong>が書かれています。<br>「こんな感じで他のプログラムで利用するといいよ」といったサンプルプログラムも載っていたりします。</p>



<p>ちなみに、Input の Description には「キーボードやマウスなどのデバイス入力情報を扱っているクラスです」みたいな感じで書かれています。</p>



<p><strong><span style="color: #ff0000;">Static Variables</span></strong> は変数、つまり<strong><span style="color: #ff0000;">他のプログラムで使えるデータ一覧です。<br></span></strong>例えば、Input クラスはacceleration という変数を持っていて、acceleration にはジャイロからの入力情報が入っています。</p>



<p>他のプログラムから Input.acceleration と呼び出せば、他のプログラムでジャイロセンサーのデータが取得できるというわけです。<br>そういった、他のプログラムから利用できるデータの一覧情報みたいなものが並んでいます。</p>



<p><strong><span style="color: #ff0000;">Static Functions</span></strong> は関数、つまり<strong><span style="color: #ff0000;">他のプログラムで使えるメソッドの一覧</span></strong>になります。変数はデータを持っていて、メソッドは特定の処理を実行します。</p>



<p>例えば、Input.GetKey(&#8220;up&#8221;) というGetKey メソッドの処理は、キーボードの上キーが押されたかどうかを調べる処理を実行します。<br>GetKey の出力値は boolean、つまり真か偽、押されたか押されてないかを出力します。</p>



<p>ちなみに、変数とメソッドを判別できるようにするため、<span style="color: #000000;">変数は単語の先頭を小文字、クラスやメソッドは単語の先頭を大文字</span>にしないといけないという C# プログラムのルールです。</p>



<h4 class="wp-block-heading"><span style="color: #ff6600;"><strong>12:50　変数と Vector3 の補足</strong></span></h4>



<p>動画内で PlayerController のプログラムが完成していますが、これについて補足しておきます。</p>



<p class="has-text-align-center">PlayerController が Player を動かすプログラム</p>



<figure class="wp-block-image aligncenter"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/Vector3.png"><img data-recalc-dims="1" loading="lazy" decoding="async" width="300" height="168" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/Vector3-300x168.png?resize=300%2C168" alt="" class="wp-image-156" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/Vector3.png?resize=300%2C168&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/Vector3.png?resize=768%2C431&amp;ssl=1 768w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/Vector3.png?resize=1024%2C574&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/Vector3.png?w=1097&amp;ssl=1 1097w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></figure>



<p><strong>変数の型</strong></p>



<pre class="wp-block-preformatted"><pre class="brush: csharp; title: ; notranslate">
using UnityEngine;
using System.Collections;

public class PlayerController : MonoBehaviour {

    private Rigidbody rb;

    void Start ()
    {
        rb = GetComponent&amp;lt;Rigidbody&gt;();
    }

    void FixedUpdate()
    {
        float moveHorizontal = Input.GetAxis(&quot;Horizontal&quot;);
        float moveVertical = Input.GetAxis(&quot;Vertical&quot;);

        Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);

        rb.AddForce(movement);
    }
}
</pre></pre>



<p>まず、「private Rigidbody rb;」について、「rb」は変数です。</p>



<p>変数はデータを持っておけます。<br>データに関しては数値だけでなく、クラスも持つことできます。<br>この「持っておく」で一体どこにデータを置いておくのかというと、コンピューターのメモリになります。パソコンのスペック表に出てくる CPU や メモリ（RAM）のそれです。</p>



<p><span style="color: #ff0000;"><strong>ゲームを遊ぶためにメモリが必要というのは、このようにプログラムの中で変数が使われて、変数のデータ保持のためにメモリが必要になるからです。</strong></span></p>



<p>private は外部から非公開（非参照）であることを宣言しています。<br>このクラスでしか使わない変数であるとあえて宣言することで、メモリを節約したりできます。<br>オブジェクト指向的には、参照できてしまうと外部からデータ内容を変更できてしまうので、それを防止するために非参照にするという意味もあります。</p>



<p>Rigidbody rb は rb が Rigidbody クラスのデータだけしか持ちませんという意味があります。<br><span style="color: #ff0000;"><strong>変数は予めどんな種類のデータを持つのかをコンピューターに宣言しなくてはいけません。</strong></span><br>これは「<span style="color: #ff0000;"><strong>変数の型</strong></span>」という C# におけるルールなので覚えておきましょう。<br>Rigidbody 型の変数 rb という感じに言います。</p>



<p>ちなみに、プログラム言語によっては、この変数の型を宣言しなくても良かったり、何でも持てますよ型みたいな型を宣言できる言語もあります。</p>



<p><strong>変数の初期化</strong></p>



<pre class="wp-block-preformatted"><pre class="brush: csharp; title: ; notranslate">
    void Start ()
    {
        rb = GetComponent&amp;lt;Rigidbody&gt;();
    }
</pre></pre>



<p>Start の中身を見ていきましょう。</p>



<p>先ほどの「private Rigidbody rb」というのは、あくまで宣言だけでデータがありません。<br>ならば、どうやってデータを追加するのかというとイコール（=）で追加します。</p>



<p><strong><span style="color: #ff0000;">イコールの左側に変数、右側にデータを書くことで、変数にデータを入力できます。</span></strong><br>ここでは Component クラスが持つ、GetComponent () というメソッドを使っています。<br>Component クラスは using UnityEngine で宣言したネームスペース中のクラスです。</p>



<p>このメソッドは、この Script コンポーネント（Component）が参照できる他のコンポーネント、この場合で言えば、Player オブジェクトに設定されている コンポーネントを呼び出しています。</p>



<p>「&lt;Rigidbody&gt;」の部分はジェネリクス（ジェネリック）と呼ばれる、メソッドの () の前に &lt;&gt; を付けることで、<strong><span style="color: #ff0000;">メソッドの出力値の型を呼び出す側が自由に指定できるようにする</span></strong>ためのもので、Rigidbody 型のデータをメソッドに指定しています。</p>



<p>同じ意味で、以下のように書くこともできます。<br>こうやって書くのが長くて面倒だから、ジェネリクスみたいな書き方が生まれたようなものです。</p>



<pre class="wp-block-preformatted"><pre class="brush: csharp; title: ; notranslate">
    void Start ()
    {
        rb = GetComponent(&quot;Rigidbody&quot;) as Rigidbody;
    }
</pre></pre>



<p>Start メソッドの中に、変数のデータ入力を書いておくことで、この Script が実行された最初のタイミングで、変数の中に Rigidbody のデータが初期化されます。</p>



<p>こうすることで、他の FixedUpdate で変数 rb を使っても、常に最新のデータが設定されているので、データが空で問題が起きるということがありませんし、Start は一度しか実行されませんので無駄な処理をしないという意味で、このメソッドの中で変数の初期化を行っています。</p>



<p><strong>Vector3の概念</strong></p>



<pre class="wp-block-preformatted"><pre class="brush: csharp; title: ; notranslate">
    void FixedUpdate()
    {
        float moveHorizontal = Input.GetAxis(&quot;Horizontal&quot;);
        float moveVertical = Input.GetAxis(&quot;Vertical&quot;);

        Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);

        rb.AddForce(movement);
    }
</pre></pre>



<p>FixedUpdate の中身を見ていきましょう。</p>



<p>「float moveHorizontal」と「float moveVertical」の行は、float 型の変数の初期化を行っています。ここでキーボードの上下左右の入力量を変数に設定しているわけです。</p>



<p>「Vector3 movement」の行も、Vector3 型の変数の初期化を行っています。<br>Vector3 とは三次元空間の <span style="color: #ff0000;">X 軸</span>、<span style="color: #008000;">Y 軸</span>、<span style="color: #0000ff;">Z軸</span>それぞれの座標を指定することで、三次元の方向量を表したものです。<br>これは Unity の Scene 表示で<span style="color: #ff0000;">赤</span>、<span style="color: #008000;">緑</span>、<span style="color: #0000ff;">青</span>の3色で方向表示されているあれと同じ意味です。<br>Transform コンポーネントの X、Y、Z の値もこの Vector3 のことです。</p>



<p class="has-text-align-center">Unity の3D表示</p>



<figure class="wp-block-image aligncenter"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/aa1a5f4288df09f4123ab8323051981e.png"><img data-recalc-dims="1" loading="lazy" decoding="async" width="300" height="296" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/aa1a5f4288df09f4123ab8323051981e-300x296.png?resize=300%2C296" alt="" class="wp-image-157" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/aa1a5f4288df09f4123ab8323051981e.png?resize=300%2C296&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/aa1a5f4288df09f4123ab8323051981e.png?w=616&amp;ssl=1 616w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></figure>



<p><strong>コンストラクタ</strong></p>



<p>「new Vector3(moveHorizontal, 0.0f, moveVertical)」の部分で、new とありますが、これは <strong><span style="color: #ff0000;">new を付けることで、</span><span style="color: #ff0000;">これはコンストラクタですよと宣言しています。</span></strong></p>



<p><span style="color: #ff0000;"><strong>コンストラクタとはクラスデータ（インスタンス）を新しく作成するメソッド</strong></span>を意味していて、入力値を指定することで、データを設定したクラスデータを作ることができます。</p>



<p>「new Vector3()」とすれば、空の Vector3 インスタンスを作成できます。<br>「新しく作成する」というのがポイントで、違うデータ設定がされたクラスを複数使うためにこの仕組みがあります。</p>



<p>「rb.AddForce(movement)」は、宣言されていた Rigidbody 型の変数 rb、そしてその rb に設定された Rigidbody クラスの AddForce メソッドが実行されています。</p>



<p>入力値は Vector3 型の変数 movement、それには Vector3 インスタンスが設定されています。この方向値を AddForce は受け取って、その方向に物理演算を実行します。</p>



<p>出力値は void なので何も出力されません（出力されませんが、処理は実行されます）。</p>



<h4 class="wp-block-heading"><span style="color: #ff6600;">14:33　パラメーターの設定と Script との連携</span></h4>



<p>Unity の特筆すべき機能に、<strong><span style="color: #ff0000;">Script で書いた内容が Unity と連携する</span></strong>というのがあります。<br>この機能が「デザイナーやディレクターが直接ゲーム開発をコントロールできる」と話題になりました。</p>



<p>動画内で PlayerController （Script コンポーネント）に、Speed というパラメーターが追加されていて値を入力することができるようになっています。</p>



<p>これは PlayerController 内に、speed という名前の変数を用意したからです。</p>



<pre class="wp-block-preformatted"><pre class="brush: csharp; title: ; notranslate">
public class PlayerController : MonoBehaviour {

    public float speed;
}
</pre></pre>



<p><span style="color: #ff0000;"><strong>Unity は　参照可能（public）な変数を自動的に見つけて、コンポーネントの項目として表示し、編集することができるようにします。</strong></span></p>



<p class="has-text-align-center">Script に public float speed を追加することで<br>Speed という項目が追加されている</p>



<figure class="wp-block-image aligncenter"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/465ce3f69021d7119efbfab213a6fab8.png"><img data-recalc-dims="1" loading="lazy" decoding="async" width="300" height="169" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/465ce3f69021d7119efbfab213a6fab8-300x169.png?resize=300%2C169" alt="" class="wp-image-136" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/465ce3f69021d7119efbfab213a6fab8.png?resize=300%2C169&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/465ce3f69021d7119efbfab213a6fab8.png?resize=768%2C433&amp;ssl=1 768w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/465ce3f69021d7119efbfab213a6fab8.png?resize=1024%2C577&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/465ce3f69021d7119efbfab213a6fab8.png?w=1093&amp;ssl=1 1093w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></figure>



<p>また、Unity 上で設定した値は、プログラム実行時、自動的に PlayerController に伝わり、　PlayerController に Speed が設定された状態でプログラムが動きます。<br>これは素晴らしいシステムだと思います。</p>



<h2 class="wp-block-heading">2. Camera and Play Area</h2>



<h3 class="wp-block-heading">01. Moving the Camera</h3>



<h4 class="wp-block-heading"><span style="color: #ff6600;">04:27　カメラを移動させるタイミング</span></h4>



<p>Main Camera を Player に追従させようとするために、初期位置の Main Camera と Player の位置関係を offset に持たせて、Player が移動したら Player の移動後の位置 + offset に Main Camera が移動するように Script を作成する所です。</p>



<pre class="wp-block-preformatted"><pre class="brush: csharp; title: ; notranslate">
using UnityEngine;
using System.Collections;

public class CameraController : MonoBehaviour {

    public GameObject player;

    private Vector3 offset;

	// Use this for initialization
	void Start () {
            offset = transform.position - player.transform.position;
	}

	// Update is called once per frame
	void LateUpdate () {
            transform.position = player.transform.position + offset;
	}
}
</pre></pre>



<p>なぜ Update ではなく LateUpdate を使っているのかというと、<a href="#script_lifecycle" target="_blank" rel="noopener noreferrer">Script のライフサイクルの図</a>を思い出してください。図では、以下のように並んでいるはずです。</p>



<p>Update<br>Internal animation update<br>LateUpdate</p>



<p>これは「Internal animation update」が内部的アニメーション更新、つまり、<span style="color: #ff0000;"><strong>Update は移動前に実行され、LateUpdate は移動後に毎フレーム実行されるということです。</strong></span><br>Main Camera の移動は Player が移動した後に行いたいので、Update だとダメだと言うことになります。</p>



<h3 class="wp-block-heading">02. Setting up the Play Area</h3>



<p>特筆すべきことはないと思います。<span style="color: #ff0000;"><strong>オブジェクトの複製は Ctrl + D です。</strong></span></p>



<h2 class="wp-block-heading">3. Collecting, Scoring and Building the game</h2>



<h3 class="wp-block-heading">01. Creating Collectable Objects</h3>



<h4 class="wp-block-heading"><span style="color: #ff6600;">04:00　クラスの乗算と1秒間を正確に知るための方法</span></h4>



<p>浮遊したキューブを自動的に回転させるために、Rotator という Script を作成します。</p>



<pre class="wp-block-preformatted"><pre class="brush: csharp; title: ; notranslate">
using UnityEngine;
using System.Collections;

public class Rotator : MonoBehaviour {

	// Update is called once per frame
	void Update () {
            transform.Rotate(new Vector3(15, 30, 45) * Time.deltaTime);
	}
}
</pre></pre>



<p><strong>演算子のオーバーロード</strong></p>



<p>まず、何気に説明無しに使用されている「new Vector3(15, 30, 45) * Time.deltaTime」、Vector3 型と float型の乗算、これは<strong><span style="color: #ff0000;">演算子のオーバーロードという特殊なことをしています。</span></strong></p>



<p>乗算は数値同士でしか行えませんが、クラスに乗算する方法があります。<br>それは「クラスに演算子（ * など）が使われたときに、クラス内部でどういう計算するか」をクラスでプログラムすることで可能になります。</p>



<p>この場合で言えば、Vector3 クラスの中に、おそらく以下のような特殊なメソッドが用意されているはずです。（実際に Unity のソースコードを見たわけでないので間違っているかも）</p>



<pre class="wp-block-preformatted"><pre class="brush: csharp; title: ; notranslate">
public class Vector3 {

    public static Vector3 operator *(Vector3 a, float d)
    {
        a.x = a.x * d;
        a.y = a.y * d;
        a.z = a.z * d;
        return a;
    }
}
</pre></pre>



<p><strong><span style="color: #ff0000;">このクラスに対して、演算子「*」が使われたときに、このメソッドがオーバーロードされて、通常の四則演算ではなくこのメソッドの内容が適用されます。</span></strong></p>



<p>入力値は、<br>a が計算式の左辺、つまり先ほどの例で言えば「new Vector3(15, 30, 45) 」、<br>d が計算式の右辺、つまり「Time.deltaTime」が割り当てられます。</p>



<p>そして出力値は、<br>左辺と右辺をプログラムされたように計算して、a を出力します。</p>



<p>こういったプログラムがあるからこそ、Vector3 型と float 型の乗算が行うことができるわけです。<br>ちなみに、演算子のオーバーロードは C#、C++、Ruby などでしかできない結構特殊な方法です。</p>



<p><strong>1フレームあたりの秒数</strong></p>



<p>キューブを回転させるために毎フレーム実行される Update を使っています。<br>では1フレームは何秒なのでしょうか。それは、このゲームが実行される環境によります。</p>



<p>シューティングゲームの用語に「60FPS」みたいなものがありますが、あれはこのフレームと関連があります。シューティングゲームのジャンルのひとつである　FPS = first person shooting と同じ略称なのでややこしいですが、<strong><span style="color: #ff0000;">60FPS とは「60 frame per second」の略です。</span></strong></p>



<p>つまり、直訳すると「1秒間に60フレーム」という単語になります。<br>「60FPS だとぬるぬる動く！」というのは、1秒間に Update が60回実行されているため、ゲームキャラクターの移動などがスムーズに動いているということになります。<br>これがパソコンが重かったりで 5FPS などだと、1秒間に5回しか移動しないため、キャラクターの移動がカクカクするわけです。</p>



<p>このように、フレームはパソコンの環境や状態によって常に実行される回数が変動しているため、<span style="color: #ff0000;"><strong>時間をフレーム内で計測するのが困難になります。</strong></span></p>



<p>そこで、Time.deltaTime があります。この <strong><span style="color: #ff0000;">deltaTime は1フレームが何秒で実行されたかをデータとして持っています。</span></strong></p>



<p>60FPS ならば、deltaTime は 1/60 = 0.01667 という値になっていて、1秒間に60回 Update されるので、Update ごとに 0.01667 すれば、1秒後に1になるわけです。<br>30FPS ならば、deltaTime は 1/30 = 0.03333 という値になっていて、1秒間に30回 Update されるので、Update ごとに 0.03333 すれば、1秒後に1になるわけです。</p>



<p>このように、ぬるぬる動く状態だろうと、カクカク動く状態だろうと、フレームの状態に合わせて deltaTime の値が1秒間に合わせて変動することで、一定の時間間隔（秒速）を求めることができます。</p>



<p>この辺りのフレームと実時間の関係は難解なので、きっちり理解するには少し追加で勉強が必要かもしれません。</p>



<p>難解な場合、今は <strong><span style="color: #ff0000;">Time.deltaTime を乗算することで、1秒間に動かす量（秒速）を求められる</span></strong>というのを暗記するだけでいいと思います。</p>



<h3 class="wp-block-heading">02. Collecting the Pick Up Objects</h3>



<h4 class="wp-block-heading"><span style="color: #ff6600;">07:53　if による条件分岐プログラミング</span></h4>



<p>どんなプログラミング言語でも、ほぼ必ず出てくる<strong><span style="color: #ff0000;">条</span><span style="color: #ff0000;">件によってプログラムを分岐させる</span><span style="color: #ff0000;">「if 文」</span><span style="color: #ff0000;">というのがあります。</span></strong></p>



<pre class="wp-block-preformatted"><pre class="brush: csharp; title: ; notranslate">
if (true か false を出力するプログラム)
{
    この{}内は true なら実行し、false なら実行されない
}
</pre></pre>



<p>このように、「()」内の値が true （真）か false （偽）かを判定して、プログラムを分岐させることができます。</p>



<p>if 文はプログラミングの基本的な部分で必ず出てきます。<br>プログラミング言語によって、書き方が微妙にことなったりしますが、分岐させるところはどの言語も同じなので覚えておくといいと思います。</p>



<p>では、実際の PlayerController の実装を見てみましょう。</p>



<pre class="wp-block-preformatted"><pre class="brush: csharp; title: ; notranslate">
    void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.CompareTag(&quot;Pick Up&quot;))
        {
            other.gameObject.SetActive(false);
        }
    }
</pre></pre>



<p>「other.gameObject.CompareTag(&#8220;Pick Up&#8221;)」が true か false かで分岐させています。</p>



<p>この場合、gameObject のCompareTag メソッドは、Tag が Pick Up という文字列ならば true、違うなら false を出力します。<br>つまり、<strong><span style="color: #ff0000;">ぶつかった物体（other）のゲームオブジェクトのタグが「Pick Up」かどうかを判定している</span></strong>わけです。</p>



<p>この CompareTag の出力結果が true なら、SetActive (false) を実行して、そのゲームオブジェクトのアクティブフラグを Off にします（true なら On）。<br>そして Off になることで、その物体は非表示になるというプログラムになるわけです。</p>



<p>逆に CompareTag の出力結果が false なら、{}内のプログラムは飛ばされるので、物体のアクティブフラグは On のまま（初期状態は On）というわけです。</p>



<h4 class="wp-block-heading"><strong><span style="color: #ff6600;">12:53　衝突フラグ</span></strong></h4>



<p>PlayerController に衝突時に実行する OnTriggerEnter メソッドを作りましたが、これは衝突した物体のうち片方（あるいは両方）の「Is Trigger」フラグが On でないと実行されません。<br>そして <strong><span style="color: #ff0000;">Is Trigger が On のときは、衝突した後に反発せずそのまますり抜けるようになります。</span></strong></p>



<p>もし、すり抜けさせず、その上で衝突時に実行したい場合は、OnCollisionEnter を使いましょう。ただし、これを使うと逆に Is Trigger が On の物体と衝突しても何も起こらなくなります。</p>



<p>微妙にややこしいですが、この違いは覚えておくと後々困らないと思います。</p>



<p class="has-text-align-center">Is Trigger にチェックを入れると<br>衝突時にすり抜けて OnTriggerEnter が実行される</p>



<figure class="wp-block-image aligncenter"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/IsTrigger.png"><img data-recalc-dims="1" loading="lazy" decoding="async" width="300" height="169" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/IsTrigger-300x169.png?resize=300%2C169" alt="" class="wp-image-161" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/IsTrigger.png?resize=300%2C169&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/IsTrigger.png?resize=768%2C433&amp;ssl=1 768w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/IsTrigger.png?resize=1024%2C577&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/IsTrigger.png?w=1093&amp;ssl=1 1093w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></figure>



<h4 class="wp-block-heading"><span style="color: #ff6600;">15:17　Rigidbody による Collider 最適化</span></h4>



<p>Pick Up に Rigidbody コンポーネントを付ける理由として、Collider の処理速度に影響するので付けますといった感じの説明がされています。</p>



<p>これは動かすオブジェクトには、Rigidbody を付けないと処理が重くなるということを意味しています。</p>



<p>オブジェクトを動かすと Collider の当たり判定を再計算しなければいけませんが、Rigidbody が付いていない物を動かしてしまうとシーン全体のオブジェクトが再計算されてしまいます。これはUnityがあえてそうしています。</p>



<p>逆にオブジェクトに Rigidbody が付いていれば、動かしたときに再計算されるのは、そのオブジェクトと影響する周りのオブジェクトだけになります。なので処理が軽くなるというわけです。</p>



<p>Use Gravity が On だと Pick Up は床を抜けて落ちていきます。<br>これは Pick Up の Is Trigger が On のためです。<br>ちなみに Is Trigger が Off のときは、床にコテンと落ちて回転の影響でズリズリ移動します。</p>



<p>床をすり抜けないようにするために、Is Kinematic を On にします。<br>これによって、Rigidbody による移動（Transform）をさせないようにします。</p>



<p class="has-text-align-center">Collider の負荷軽減のため Rigidbody を加える</p>



<figure class="wp-block-image aligncenter"><a href="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/rigidbody.png"><img data-recalc-dims="1" loading="lazy" decoding="async" width="300" height="169" src="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/rigidbody-300x169.png?resize=300%2C169" alt="" class="wp-image-162" srcset="https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/rigidbody.png?resize=300%2C169&amp;ssl=1 300w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/rigidbody.png?resize=768%2C433&amp;ssl=1 768w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/rigidbody.png?resize=1024%2C578&amp;ssl=1 1024w, https://i0.wp.com/fujiwarakoubou.jp/wp-content/uploads/2016/12/rigidbody.png?w=1092&amp;ssl=1 1092w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></figure>



<h3 class="wp-block-heading">03. Displaying the Score and Text</h3>



<h4 class="wp-block-heading"><span style="color: #ff6600;">07:41　文字列の連結と ToString メソッド</span></h4>



<p>文字列は「+」演算子によって、文字をつなげることができます。<br>これも実は String クラスの演算子のオーバーロードになります。</p>



<pre class="wp-block-preformatted"><pre class="brush: csharp; title: ; notranslate">
countText.text = &quot;Count: &quot; + count.ToString();
</pre></pre>



<p>ToString は Int32 クラスのメソッドです。<br>「int count;」は整数値を宣言していましたが、これは「Int32 count;」という Int32 型のクラスを宣言していることと同じです。<br>この辺りは少しややこしいので細かい説明は省略しますが、ようは<span style="color: #ff0000;"><strong>数値や文字列もクラスであってメソッドを持っているということです。</strong></span></p>



<h3 class="wp-block-heading">04. Buiding the Game</h3>



<p>特筆すべきことはないかと思います。<br>Unity は様々な環境に合わせてビルドすることができます。</p>



<h2 class="wp-block-heading">終わりに</h2>



<p>ものすごく長文になってしまいましたが、主にプログラミングの知識について補足できたのではないかと思います。</p>



<p>この補足量から考えると、Unity と言えど全くのプログラミング初心者には難しい代物だと言えるでしょう。</p>



<p>チュートリアルの最初も最初で難しすぎて挫折する人も多いかと思います。<br>その助けに少しでもこの記事が役に立てれば幸いです。</p>The post <a href="https://fujiwarakoubou.jp/2016/12/13/game-developer-complement-by-unity-tutorial-on-roll-a-ball/">ゲーム開発者が補足するUnity公式チュートリアル～Roll-a-ball編～</a> first appeared on <a href="https://fujiwarakoubou.jp">藤原工房</a>.]]></content:encoded>
					
					<wfw:commentRss>https://fujiwarakoubou.jp/2016/12/13/game-developer-complement-by-unity-tutorial-on-roll-a-ball/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">113</post-id>	</item>
	</channel>
</rss>
