UnityでC#は違いますか?


18

Unityは異なるバージョンのC#を使用していますか、それともすべて同じですか?見た目は通常のC#とは異なりますが、通常のC#要素がいくつかあります。


4
どのような違いが見られますか?
アンコ14

参照している変更は、C#言語ではなく、フレームワークの違いであると思われます。Unity3dでは、.Netフレームワーク(Via Mono)とUnity固有のフレームワーク要素をC#言語で使用しています。
マイクB 14

それは非常に古いバージョンです。C#とMonoの最新バージョンが必要で、事前に作成されたエンジンのスクリプトを作成するのではなくプログラムする場合は、monogame.net
Den 14

ライブラリにわずかな違いがあることに気付きました。たとえば、UnityにはMathクラスの代わりにMath関数用のMathfクラスがあります。他の違いがある場合、私は注意を払っていませんが、それが際立っていました。
アレックス14

@Alex System.Mathは引き続き利用可能であり、明らかにUnityEngine.Mathf より実際に高速です。したがって、Unityバージョンを使用する唯一の本当の理由は、パフォーマンスを犠牲にして大量の(浮動)キャストを避けることです。
FlintZA 14

回答:


9

他の回答で述べられているように、Unity 4.xはMono 2.6に基づいたMonoの修正版を使用しています

ほとんどの場合、これは.Net 2.0互換性がありますが、Mono 2.6固有の互換性リストを追跡することはできませんでした。

見た目は通常のC#とは異なりますが、通常のC#要素がいくつかあります。

あなたの質問に対するコメントの1つで述べたように、これはおそらく言語自体ではなくUnityの特定のスクリプトAPIによるものです。

例として、典型的なUnityプロジェクトの多くのコードは、MonoBehaviorと呼ばれるクラスのサブクラスに含まれています。これらは、Unity Editor環境内のGameObjectsにドロップされるコンポーネントです。このアーキテクチャにより、C#コードはさまざまな点で(とにかく)典型的なC#コードとは異なります。

  • Unity 4がリリースされるまで、これらのオブジェクトはネームスペースに含めることができなかったため、常にグローバルネームスペースにあります
  • フィールドをパブリックにすることで(またはSerializeField属性を使用することでエディター環境にフィールドを公開しますが、これを使用する人はほとんどいません)、クラスのパブリックフィールドの数が異常に多くなる
  • Unityのプライバシーとケースの規則はMicrosoftの規則に従っていないため、これは「伝統的な」C#開発者にとっては奇妙に見えることもあります。
  • これらは、通常期待されるようなオーバーライドではなく、代わりにリフレクションを使用してアクセスされる、StartやUpdateなど、これらのコンポーネントで多くの特別なメソッドを使用します。

実際には、Unityの現在のC#バージョンで見逃している最大のC#言語機能は、非同期および関連するキーワードと機能のサポートです。Unityの同様の概念はコルーチンです。これらはメインスレッドで実行されるため、非同期ではありませんが、長時間実行されるコードを複数のフレームに分割できます。低レベルのマルチスレッドは引き続きサポートされています。


2
明確にするためにasync、C#ではマルチスレッドのように非同期ではありません。メインスレッドでも実行されます。コルーチンと非同期の使用上の観点からの最大の違いは、コードが実行される時間です。
rhughes

ありがとう。はい、非同期!=マルチスレッドですが、非同期を使用してマルチスレッド操作を非表示/対話することは、コルーチンで同じことをするよりもはるかに一般的だと思います。私は、スレッドプールでデリゲートタスクを開始するラッパーコルーチンを作成しました。これにより、非常に似たレベルの柔軟性が得られますが、「適切な」非同期サポートは気になりません。もちろん、まともな現代のGCはさらに良いでしょう;)
FlintZA

21

Unity 4 、C#言語を含む.NETフレームワークの完全な実装であるMono 2.6を使用します。

どのように見えるかはわかりませんが、Unityは複数の言語をサポートしており、それらはすべて同じMonoランタイム上で動作します。C#とUnityScriptを混同している可能性はありますか?


10
加えて、Mono 2.6は言語機能の点でC#3.0と同等です。Mono 2.6.1はC#4.0機能の追加を開始しました。
クーパー14

これは、v4.1.2 でのUnityのMono互換性の概要です
ケリートーマス

マイナーバージョンだけでなく、メジャーバージョンの増分も遅れます:mono-project.com/Release_Notes_Mono_3.4
Den

3

Unityは通常のC#を使用します。

繰り返しになりますが、UnityでC#を作成するときは、多くのライブラリを使用しますが、私が知る限り、Unityでは、以下に示す違いを除いて、C#で可能なすべてのことが可能です。

  • Windows FormsおよびASPに関連する.Netのより具体的な領域は、Unityによる立ち入り禁止です。

  • Visual Studioを使用して編集およびコンパイル時エラーを作成できますが、Unity IDEでビルドして実行する必要があります。

  • Unityは、.Netのオープンソース実装であるMonoを使用します。これは、わずかな違いがあることを意味します。


2番目の項目を拡張するには、UnityVSを使用してVisual Studio内でデバッグすることもできます。マイクロソフトは最近、開発者を買収したため、近い将来無料でプラグインをリリースする予定です。
mrohlf 14

申し訳ありませんが、通常のC#にはほど遠いです。
アルパー

0

Unityが使用するC#バージョンが「通常の」C#と異なるかどうかの質問は、他の投稿で回答されています。あなたは明示的に(Visual Studioの2010年以降で#4.0すなわちC)仕事でC#Iの使用を比較するとき、私は気づいた私は、わずかな違いを共有することになり、このような定期的なバージョンと異なる場合がありますいくつかの要素を求めるとユニティでC#、されているので、これ関数定義のパラメーターにデフォルト値を使用できないということです。つまり、C#の新しいバージョンを使用するには、プロジェクトをより慎重にセットアップする必要があります。詳細については、このリンクを参照してください。

編集: 私が知っている限り、これは非常に多くの人々に起こる誤解であるため、私はこの答えを残します。


この機能はバージョン4.0のC#にのみ追加され、以前は存在していなかったため、この機能が存在しないことを「C#」の「違い」と呼ぶことはできません。
ORマッパー14

1
C#バージョン4は2010年にリリースされました。多くの人がそれを使用していて、私のように、Unityでプログラミングするときは存在しないと感じています。
ネスノ14

デフォルト値を使用することはできませんか?私はかなり確信して、私がやると持っているんだ...
NPSF3000

さて、試してみましたが、デフォルト値を使用できないことを通知するメッセージが表示されません。Unityの特別なバージョンを使用していますか?プロ版が好きですか?
ネスノ14

1
絶対にデフォルト値を使用できますが、proまたはnot-proとは関係ありません。UnityとMonoDevelopには奇妙な関係があります。MonoDevelopで自動生成されるプロジェクトは、多くの場合、デフォルト値をサポートしない以前のバージョンのC#に設定されます。ただし、プロジェクトでその設定を変更しても、問題なく機能します。MonoDevelopでのコンパイルを無視して、単にUnityに戻ると、Unityはデフォルトのパラメーターについて文句を言わないことに気付くでしょう。
MrCranky 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.