質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

4095閲覧

unityのC#での名前空間の使い方について、とアクセス修飾子について教えてください。

LINQLINQ

総合スコア1

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2021/10/21 13:14

知りたいこと

Unityの名前空間について、質問です。

自分の今の理解してるのは、
クラス名が他の人が作成したクラス名と被ってしまうと、衝突が起きるので、
コンパイルを通すときにエラーが発生するので、
特にチーム開発の時には、基本的には名前空間を使って、クラス名の衝突を避ける。

というのは理解できてます。

で、知りたいことは、
皆さんは、namespaceはどこまでの粒度で命名されていますか?

例えば、PlayerとEnemyのカテゴリー別でスクリプトをフォルダの中に分けているとします。
この場合、Playerの名前空間と、Enemyの名前空間を作るとか、、です。

例として、以下にnamespaceを使わないManagerクラスのコードを記載します。
また「疑問に思うこと」では、2つのコードにPlayerの名前空間とEnemyの名前空間を使っています。

C#

1public class PlayerManager : Monovihaviour{ 2 //処理 3}

C#

1public class EnemyManager : Monovihaviour{ 2 //処理 3}

上記のスクリプトでは、クラス名は完結にはなっています。

PlayerならPlayerのみのnamespaceに。
EnemyならEnemyのみのnamespaceに。

ここまでの粒度の名前空間って、逆に使いずらいような気がしています。

ちなみに、今までは一つのプロジェクトに、プロジェクト名のnamespaceをつけていました。

namespaceは以下の「疑問に思うこと」の2つのコードで、
試しにManager.csスクリプトを作成してみたのですが、同じクラス名にはできませんでした。

疑問に思うこと

次に、namespaceを使って、Managerクラスを作っている場合は

  • PlayerManager.cs > Manager.cs
  • EnemyManager.cs > Manager1.cs

Manager.cs

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using Enemy; 5 6namespace Player 7{ 8 public class Manager : MonoBehaviour 9 { 10 public int playerHP; 11 void Start() 12 { 13 Enemy.Manager1 manager = new Enemy.Manager1(); 14 manager.enemyHP = 0; 15 16 } 17 } 18} 19

Manager1.cs

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using Player; 5 6namespace Enemy 7{ 8 public class Manager1 : MonoBehaviour 9 { 10 public int enemyHP; 11 void Start() 12 { 13 Player.Manager manager = new Player.Manager(); 14 manager.playerHP = 10; 15 } 16 } 17}

別件ですが、簡単な質問をもう一つだけ。

publicなので、usingを使わずともアクセスができると思うので、
UnityでのInternalアクセス修飾子の同一アセンブリのみっていうのがいまいち理解できていません。
UnityHubでプロジェクトを2つ作成したとしたら、publicにしたら、この違う2つのプロジェクトのクラス間もアクセスできてしまうのでしょうか?
そうならinternalにほとんどしないといけないのでは?と思ってますが、
例えば上の疑問に思うことに記載しているコードだと、他のプロジェクトからアクセスできるのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/10/21 23:29 編集

> 名前空間の使い方について、とアクセス修飾子について教えてください 質問の「別件ですが・・・」以降がアクセス修飾子の質問で、前半の名前空間とは関係がない話のようですが、であればスレッドを別けて質問してはいかが?
LINQLINQ

2021/10/22 01:38

はい。 そうしてみます!
guest

回答2

0

衝突を避ける

実際には MFC くらいでしか「何これふざけてるの!?」とかいう衝突経験をしたことはないので,
あまりこの点を意識した形で namespace を用いてはいません.
(いかにも衝突しそうな名称をわざと用いてやるぜ! くらいしないと,まず衝突しないような気がする.)

そのため下記のような感覚で用いています.

namespaceはどこまでの粒度で命名されていますか?

ソースコード群をフォルダにわけるじゃないですか.それと同じような感覚の粒度にしています.
「ソースファイル群をある同一のフォルダに突っ込む理由」と,「class 等々をある同一の namespace に突っ込む理由」がかなり似ているかな…みたいな.

なので,ソースファイル群がフォルダ階層内にあるとき,
ある程度上位階層のフォルダ構成がほぼほぼ namespace になっていたりします.

投稿2021/10/27 02:25

fana

総合スコア11996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2021/10/27 06:35

Visual Studio で C# のとき, ソリューションエクスプローラでの「フォルダ」と,実際のファイルシステムの「フォルダ」は同一のものになっていて, ソリューションエクスプローラでクラスを新規作成すると→追加した箇所のフォルダ階層がそのまま namespace になった形のソースが追加される. なので,このような手順でやってると,完全に「フォルダ階層=namespace」になっちゃうんだけど, でもそれはちょっと違うかなぁ,と感じる.
fana

2021/10/27 06:38

C++ のときには, ソリューションエクスプローラでの「フォルダ」ってのは,単なるそこでの表示階層みたいな概念でしかなくて,実際のファイルシステムの「フォルダ」とは無関係. (自分としてはこっちに慣れてるから,C#側はなんか嫌.)
guest

0

ベストアンサー

個人的な意見で良ければ。

私の場合は、「内容レベル」(= 大枠の処理レベル)で分離しますね。

namespaceの強みは『重複を避ける』ことにあると思っているので、「クラスレベルでの分離」ではなく、
処理レベルでの分離ですね。

(ゲームは作ったことないので詳しくはわかりませんが)Enemy, Playerは単にキャラの分類なので、
Characters.Enemy, Characters.Player とかみたいにほぼ同じnamespaceでやります。
ですが、(ゲーム内の)フィールドを表現するクラスの場合はStages.GameField とかみたいに別のnamespaceで。

一括処理程度のものでも、「ファイル処理系」はFileManipulator名前空間、「画像処理系」はImageProcessor名前空間... とかみたいに役割というか、対象範囲みたいなもので分離しますかね。

後は、実務レベルだと複数人で開発するようなので、「担当者の名前をnamespaceにする」というコーディング規約があるところもあるようです。(ネットの情報ですが)

たとえば私が担当する場合は、BeatStar.Person とかみたいな感じ? でしょうか。

この考え方であれば、質問者さんが感じておられる問題を解決できるのではないでしょうか。

投稿2021/10/21 13:31

BeatStar

総合スコア4962

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LINQLINQ

2021/10/22 01:42

とても参考になりました。 処理レベルで分けるんですね。 そういわれるとEnemyとPlayerで分けないで、これからは処理単位で名前空間を作ってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問