# Python開発者がC#を初めて触れて感じたこと - 私の主力言語は間違いなくPythonです。Webアプリケーション開発、各種業務ローカルアプリ作成、AI学習と推論、LoRA作成など、多くの作業をPythonで行っています。 - Pythonほどではありませんが、ある程度扱える言語としてJavaScriptとC++があります。Web関連の業務が最も多い私にとって、JavaScriptは嫌でも触れることになる縁であり、組み込みハードウェアを専門とする方以外で、世の中のすべての開発者の中でJavaScriptを少しでも扱ったことがない人はいないだろうと個人的には思っています。 > 私の好きな映画の有名なセリフを借りるなら、「JavaScript actually... is everywhere.」と表現したいです。 - C++は難しいです。しかし、Linuxを扱う、特にaarch64 (arm64アーキテクチャ) のマシンを扱う際には、各種パッケージやライブラリを自分でビルドしてポーティングしなければならないことがしばしばあります。また、Pythonの遅い演算を補うために、ほとんどのPythonライブラリは実際にはC++で書かれたバイナリをPythonでラップしている場合が多いです。したがって、私のようにPythonを主力とし、Linuxユーザーであれば、C++もある程度扱う時期が来ます。 - 直接C++を扱ってみると頭を悩ませる時が来ます。それはメモリ管理です。C++に挑戦する人々が最初に挫折を味わうのはこの部分ではないでしょうか。ポインタやメモリのガベージ管理は、高水準のインタプリタ言語を快適に使っている開発者にとっては大きなハードルだと考えます。 ![Python開発者がC#を接する前後の比較イメージ](/media/jesselove/blog_img/4909340cd33f4a82a646e7fda2ccec5a.webp) ## C#に触れることになった理由:Unity {#sec-6253256cfe60} 最近、[[Unity]]での作業を始めることになりました。 WebやWebブラウザが好きなので、以前Web上で動作する2Dゲームを作成・公開した経験があります。 「MAME RUN!!」という、障害物回避しながら目標に向かって走る2D横スクロールゲームでした。 登場人物とストーリーは、私が好きで応援している日本のアイドルグループ「豆柴の大群」のメンバー5人がキャラクターとして登場するゲームで、純粋に「推し活」の一環として彼女たちを応援する気持ちを伝えたくて、3〜4日徹夜して作ったゲームがありました。 公開後、XやTikTokにプレイ動画をアップロードしたところ、これが予想外に大きな反響と関心を集めました。 「豆柴の大群」のメンバーからも「いいね」をもらい、多くの人が実際にプレイしてくれました。数百人もの人が訪れ、かなりの回数プレイしてくれたのです。この反応はとても新鮮で、私にとって大きなモチベーションとなりました。 しかし、当時公開したゲーム「MAME RUN!!」は、実は私の企画資料ではステージ4まであり、その後エンディングまで企画されていましたが、実際にはステージ1しか実装していませんでした。まだ人々の反応も分からなかったので、とりあえずステージ1まで作って反応を見てみようという考えもありましたが、それよりも大きな要因は、とにかく大変だったことです。 私が実装した方法は、完全なVanilla JavaScriptとHTML5のcanvas機能。この二つだけで制作したからです。 企画も一人、キャラクターデザイン、障害物、背景、コインなどのオブジェクトデザインも一人で行い、 **何よりもゲームエンジンをJavaScriptで全て自作**しました。 スプライトをアニメーションとして動かすロジック、 重力ロジック、速度ロジック、ゲーム終了ロジック、時間経過による高速化、スコア計算、UIとのインタラクション、衝突判定、ゲーム終了判定、ゲーム終了時のイベント、障害物のスポーンロジック、障害物のランダム出現ロジックなど、ゲームプレイに必要なすべてのロジックを直接書いたため、正直なところかなり疲弊しました。 しかし、ステージ1をクリアすると、「近いうちにステージ2を作ります」という小さなUIメッセージを入れてしまい、プレイしてくれた人々に約束をしてしまったことが、ずっと私の心の中に「負い目」として残り続け、この負い目に対する責任感が、最終的に私がUnityを始めるきっかけとなりました。 ### 責任を果たすために {#sec-a14bf8cb9e44} しかし、あの地獄のようなJSエンジンを再び触る気にはなれませんでした。ステージ2からはキャラクターの特殊能力やアイテムなど、実装すべきものがさらに多かったからです。 そこでふと、UnityやUnreal Engineのような専門ツールを使えば、ゲームに必要な核となる機能がすでに内蔵されているので、はるかに楽なのではないかという希望を抱くようになりました。実は以前からこれらのツールの存在は知っていましたが、C#の経験もなく、何となく大げさに思えて「慣れたJSで適当にやってみよう」と見過ごしていたのです。 しかし、「MAME RUN!!」を制作する中で実際にぶつかってみると、「ゼロから作る苦痛」の方がはるかに大きいことを脳が学習してしまいました。私は高等動物である人間なので、より良いツールを検討するようになり、たとえC#/C++の巣窟であろうとも、Vanilla JSよりはマシだろうと考え、Unityを新しいパートナーとして選びました。 ### なぜUnity?Unrealではないの? {#sec-bdce487ddb88} 実はツールを決める際に迷いました。少しでも慣れているC++を使うUnreal Engineの方が良いのではないかという気持ちも少しはありました。 > 「えへへ…私…C#…初めてなの…(照れ照れ)」 それでもUnityに決めた明確な理由があります。 1. **スペックの限界:** 私の作業マシンはそれほどハイスペックではありませんでした。AMD64 (Windows) 環境で最も良いスペックが5年前のi7-12700F + RTX 2060の組み合わせで、ストレスを減らすには比較的軽量なUnityの方が良いと判断しました。 3. **ツールの用途:** 「ネズミを捕るのに牛刀を使う必要はないだろう?」。「MAME RUN!!」は2Dゲームです。私の頭の中のUnrealは、「アサシンクリード」や「レッド・デッド・リデンプション2」のような3D大作オープンワールド用というイメージが強く、2Dゲームにはオーバースペックだと感じました。 そうしてUnityをインストールし、公式ドキュメントやチュートリアルを見ながら少しずつ慣れていきました。 ## C#に対する印象 {#sec-071e55ac8908} Unity自体についても話したいことはたくさんありますが、話が長くなりそうなので、今回はC#言語自体に焦点を当ててみようと思います。 ### きれいで整理された印象 {#sec-ce2edea9659f} 名前からC++に近い感じかと思いきや、実際にはCの見た目をした現代的なマネージド言語であるJavaやJavaScriptにはるかに似ていました。中括弧{}を使い、if、for、class、returnのような構造が慣れていたため、第一印象はJSに似ていると感じました。 例えば、このような表面的な印象が似ています。 ```c# if (score > 10) { Console.WriteLine("OK"); } ``` ```javascript if (score > 10) { console.log("OK"); } ``` しかし、少し使ってみると、JSとは異なるかなり整理された印象を受けます。JSでは感じられない、何か静的な感じというか?うまく説明するのは難しいですが、IDEのサポートもC#コードでしっかりしているせいか、可読性も良く、整理された印象のコードになります。 やはりJavaと競合する言語だな、と自然に思えるほど、C++とは異なり、極限のハードウェア制御やメモリを気にしなくて済む点が便利でありながら、最終的にはバイナリにコンパイルされてランタイムで動作するという点でパフォーマンスも確保する、かなり現代的でパフォーマンスと使いやすさのちょうど中間に位置する言語である点も魅力的でした。 ### インデントに慣れたPython開発者の印象 {#sec-9e54bf2b31b3} Pythonのインデント方式に慣れた多くの開発者がJavaScriptコードを見たときに感じるあの括弧の地獄…{}、()… > ああ、「くそ、この文は一体どこで終わるんだ?}が一つ足りない気がするんだけど…?」 JavaScriptのコードが少し長くなり複雑になると、いつもこんな気持ちになります。 しかし、C#は意外にも > 「思ったより窮屈でなく、かなりすっきりしているな?」 という印象を受けました。正直、まだその理由は分かりません。IDE (vscodeを使用中) のおかげかもしれませんし、フロントエンドの複雑な非同期ロジックが満載のJSとは異なり、バックエンド的な静的構造がコードに溶け込んでいるからかもしれません。おそらく**「強力な型システム (Static Typing)」**と「名前空間ベースの構造化」がされているため、開発者の頭の中で無意識のうちにコードの構造が描かれるからなのかもしれません。 ## 終わりに {#sec-2285ec3b5a13} まず、Web開発者という立場から見ると、C#はかなり魅力的な言語だと感じます。 なぜなら: PythonでFastAPI/Django/DRFばかりやっていると、大規模なGUIアプリ、ゲーム、リアルタイムインタラクションの感覚が弱くなることがありますが、C#はその部分をとてもうまく補ってくれるようです。 そしてUnityと連携すると、インタラクション、状態管理、イベント、オブジェクト構造化の感覚を習得するのに非常に良い経験になると考えます。 このような経験は、再びWebフロントエンドやアプリ設計にも良い影響を与えるでしょう。 つまり、C#とUnityはWeb開発者にとって**「動的なプログラムを構造的に設計する感覚」**を一段と成熟させるのに役立つだろうと感じています。 そしてもっと正直に言えば、パフォーマンスのためにC++を扱うことに心の奥底で憧れを抱きつつも、C++はやはり少し荒々しく疲れる一方で、 C#は楽しさを失わずにシステム的思考を身につけるのに良い言語だと考えています。 だからといって、読者の皆さんにC#を試すことをお勧めするわけではありません。言語というものは**どれが良い**という概念が存在するものではなく、単に私の考えと企画を実現するためのツールに過ぎず、私もUnityが必要だったからC#を始めたに過ぎません。 今後、このブログでUnityカテゴリとトピックを開設し、私のUnityとC#の経験談でブログを埋めていこうと考えています。 ご興味のある方は、このブログを購読!フォローをお願いします。 フォロー機能はまず[Mikihandsブログプラットフォーム](https://blog.mikihands.com/)に登録した後、利用可能です。 登録は無料で簡単ですので、ぜひ登録とフォローをお願いします。 皆様の関心と応援が、記事作成のモチベーションとなります。