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

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

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

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

Unity

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

Q&A

解決済

1回答

4856閲覧

一意なID の生成の仕方。

MOTOMUR

総合スコア195

C#

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

Unity

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

0グッド

1クリップ

投稿2020/05/31 08:48

編集2020/05/31 09:17

C#

1public class AllyMemberStatus : MonoBehaviour 2{ 3 public static string charactorName = " "; 4 public static string charactorID = " "; 5}

上記のクラスAllyMemberStatusのcharactorIDを「一意なIDを作成してそのIDを」保存したい。

C#

1  private System.Guid guid = System.Guid.NewGuid(); 2 private string uuid = guid.ToString();

調べるとGuidで一意なIDは作成できそう。
しかし、上記コードでは下記のエラー

Assets\Resources\AllyStatus\AllyMemberStatus.cs(9,40): error CS0236: A field initializer cannot reference the non-static field, method, or property 'AllyMemberStatus.CharactorID'

ゲーム内部のキャラクターIDを管理するとき、Guidではなく皆様自作でやっておられるのでしょうか?それとも、Guidの使い方が間違ってますでしょうか。教えてください。

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

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

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

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

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

Zuishin

2020/05/31 08:53

まずエラーを読むところから始めますね。
MOTOMUR

2020/05/31 08:55

runする以前にエディタで怒られてます。 AllyMemberStatus.guid参照できません。となります。
BluOxy

2020/05/31 08:57

privateなメンバーを外からアクセスしようとしているからではないでしょうか。
Zuishin

2020/05/31 08:57

ならないでしょう。いい加減な読み方ではなく、ちゃんと読んでください。
MOTOMUR

2020/05/31 09:07

>BluOxy様 public string CharactorID = System.Guid.NewGuid().ToString("N"); public static string charactorID = CharactorID; 試行錯誤して上記コードに変更すると、今度はAllyMemberStatus.CharactorIDを参照できませんとなります。Guid自体はPublicだったと思うのでどこかでプライベートになってしまってるのでしょうか、、、
Zuishin

2020/05/31 09:13

質問している間にコードがコロコロ変わったのでは切り分けすらできません。コードを書き換える前にどのコードでどのエラーメッセージが出たのかを調べ、「きちんと」読んでください。 質問のコードではそのようなエラーが出るはずはありません。意訳は不要です。そのまま読んでください。
BluOxy

2020/05/31 09:15

その前に問題を正確に精査していただきたいです。 > AllyMemberStatus.guid参照できません。となります。 具体的に何のエラーコードを返したのでしょうか。質問は編集できるので、質問に記載してください。 > AllyMemberStatus.CharactorIDを参照できません それではアクセスできません。問題に気づくには、エラー内容を読んでからです。 また、このエラーが分からないとなると、C#の基礎を理解していないように見受けられます。 > Guid自体はPublicだったと思うのでどこかでプライベートになってしまってる その根拠はなんでしょうか。 間違っていても良いです。ただ、もし根拠がない推測であれば、考えが誤った方向にしかいかないので、やめたほうがいいです。
MOTOMUR

2020/05/31 09:16 編集

Assets\Resources\AllyStatus\AllyMemberStatus.cs(9,40): error CS0236: A field initializer cannot reference the non-static field, method, or property 'AllyMemberStatus.CharactorID' ほかのスクリプトも編集中でしたので(ほかのスクリプトも直し途中でエラー)それを整理してrunしました。上記のエラーです。
MOTOMUR

2020/05/31 09:21

staticではないフィールドだから見つからなかったんですね。 staticを付けたらエラーではなくなりました。 しかし、上記の場合なぜstaticが必要であったのかがわかりません。
MOTOMUR

2020/05/31 09:22

ZuishinさんのURL読んでみます。
BluOxy

2020/05/31 09:23

まず、staticの意味を理解して使っているでしょうか。 そうでなければ、staticが必要かどうかは分からないに決まっています。
BluOxy

2020/05/31 09:29

分からないことを放置してコードを書くと今回のように躓くリスクが発生するので、C#の基礎を習得した方が良いです。 そして、仮に今回のようなことで躓いたときは、**事象** を正確に把握してください。 具体的にはエラーの内容を理解することです。 今回のケースでは、Zuishin さんの貼った公式のドキュメントに書いてある CS0236 エラーの情報を読んで、MOTOMUR さん自身で事象が起きたか確かめてください。 その事前調査を行えば、大抵の場合は自己解決します。 それでも今回の問題が解決しなければ、どこが問題なのか、改めて記載してください。 ※解決したならご自身の回答をBAに選択してクローズしてもらえればと思います
MOTOMUR

2020/05/31 09:29

staticなしの宣言だとインスタンスフィールドになってしまうんですね。インスタンスフィールドだとメソッド外部でインスタンスフィールド同士で初期化できない(代入側がインスタンスフィールドだとだめ)。 インスタンスフィールドを使いたいならメソッドかクラスコンストラクター内で初期化、外で初期化したいならstaticフィールドを使えばよかったということで、間違いないでしょうか。
MOTOMUR

2020/05/31 09:32

間違いがなければ自身BAでクローズします。 また、C#基礎についてはさらっと読んで覚えたつもりですが、実際使用してみると混乱してしまいます。なるべくご迷惑をおかけせずに学習していきたいと思います。
BluOxy

2020/05/31 09:35

> staticなしの宣言だとインスタンスフィールドになってしまう はい。なってしまうというより、それが一般的なC#のコードです。 staticはオブジェクト指向であるメリットを失うので、理由がない限り多用すべきではありません。 > インスタンスフィールドだとメソッド外部でインスタンスフィールド同士で初期化できない すみません。「インスタンスフィールド同士で初期化」の意味が分かりませんでした。 > インスタンスフィールドを使いたいならメソッドかクラスコンストラクター内で初期化 publicなフィールドなら外からでも変更できます。 > 外で初期化したいならstaticフィールドを使えばよかった 何か違うと思います。下記がポイントです。 https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/static > static 修飾子は、静的メンバーの宣言に使用します。静的メンバーは、特定のオブジェクトではなく、型自体に属するメンバーです。 「例 - 静的フィールドとメソッド」を読んでみて、staticなメンバーと非staticなメンバーの値の状態と、アクセス方法の違いを確認してください。
Zuishin

2020/05/31 09:44

原因はこれです。 > フィールド初期化子は、静的でないフィールド、メソッド、またはプロパティ 'field' を参照できません 静的でないフィールド、静的でないメソッド、静的でないプロパティを、フィールド初期化子で使うことはできません。 そして解決法はこれです。 > クラス コンストラクター内で初期化を実行することをご検討ください。
guest

回答1

0

自己解決

今回のエラーはメソッドやコンストラクター外で、非staticフィールドのguidの中身をuuidに代入しようとしていたから起こったエラーです。
インスタンスフィールドを代入する場合にはコンストラクター内で行うか、静的メンバーのstaticなguidとして生成したのちに代入、もしくは private string charactorID = System.Guid.NewGuid().toString();のようにstaticな内容をcharacterIDに代入するべきでした。

投稿2020/06/01 11:40

編集2020/06/02 13:23
MOTOMUR

総合スコア195

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

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

BluOxy

2020/06/01 13:48 編集

> 今回のエラーはメソッドやコンストラクター外で、インスタンスフィールドのguidの中身をuuidに代入しようとしていたから起こったエラーです。インスタンスフィールドを代入する場合にはコンストラクター内で行う 概ね正しいと思います。 ※余談 「インスタンスフィールド」でも通じますが、「フィールド」「非staticフィールド」でも通じます。「インスタンスフィールド」は、聞かない訳ではないが、あまり馴染みがないので気になりました。 > 静的メンバーのstaticなguidとして生成したのちに代入 どう代入するか、実際の書き方によってその回答の正否が変わります。 > private string charactorID = System.Guid.NewGuid().toString();のように明示的にstatic なcharacterIDに代入するべきでした。 その宣言では、characterIDは非staticなメンバーになるので、「static な」は間違いです。
MOTOMUR

2020/06/02 12:38

private string CharactorID = System.Guid.NewGuid().ToString("N"); よくよく考えたら上記のコードでコンパイルが通る理由はstaticはほぼ関係なく、質問文のコードで起こっていたstaticフィールドの扱いの間違いを解消したからだと思います。 非staticフィールドの代入をやめ、CharactorIDにstringのGuid(一意のstringなので、"hoge"を代入したのと同じ)を入れるようにしたから成立したんだと思います。
BluOxy

2020/06/02 13:13

コンパイルが通ることは問題ではありませんから、そちらの理由を考えても仕方ないと思います。 問題はコンパイルが通らないことなので、そちらの問題が解決できていれば回答に書いたうえで質問をクローズすれば良いと思います。
MOTOMUR

2020/06/02 13:20

ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問