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

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

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

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

4回答

1746閲覧

Unity)non-staticエラー

navesanta

総合スコア198

C#

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

0クリップ

投稿2019/02/05 04:27

編集2019/02/05 08:46

Jsonを使ったアプリを作成しています。
取得したJsonデータを格納したいのですが普通のメソッドとstaticメソッドが混在していて
An object reference is required for the non-staticと言う
エラーになってしまい困っています。

GetTextureBinary method:

private void GetTextureBinary(Texture2D texture){ if(texture == null){ Debug.Log("no data"); //ここにエラーメッセージを入れる } MakeAnalysisRequest(texture.EncodeToPNG()); } static async void MakeAnalysisRequest(byte[] byteData){ HttpClient client = new HttpClient(); client.DefaultRequestHeaders.Add("Key", subscriptionKey); string requestParameters = "returnFaceId=true&returnFaceLandmarks=false" + "&returnFaceAttributes=age"; string uri = uriBase + "?" + requestParameters; HttpResponseMessage response; using(ByteArrayContent content = new ByteArrayContent(byteData)){ content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); response = await client.PostAsync(uri, content); string contentString = await response.Content.ReadAsStringAsync(); Debug.Log("contentString:" + contentString); Debug.Log(PlayerInfo.CreateFromJSON(contentString)); } } }

PlayerInfo.cs:

using UnityEngine; [System.Serializable] public class PlayerInfo{ public string faceId = "12345-678"; public FaceRactangle faceRactangle; public FaceAttributes faceAttributes; public static PlayerInfo CreateFromJSON(string jsonString){ return JsonUtility.FromJson<PlayerInfo>(jsonString); Debug.Log("playerInfo2.faceId:" + faceId); Debug.Log("playerInfo2.faceRactangle.top:" + playerInfo2.faceRactangle.top); Debug.Log("playerInfo2.faceRactangle.left:" + playerInfo2.faceRactangle.left); Debug.Log("playerInfo2.faceRactangle.width:" + playerInfo2.faceRactangle.width); Debug.Log("playerInfo2.faceRactangle.height:" + playerInfo2.faceRactangle.height); Debug.Log("playerInfo2.faceAttributes:" + playerInfo2.faceAttributes.age); } } [System.Serializable] public class FaceRactangle{ public int top = 10; public int left = 20; public int width = 30; public int height = 30; } [System.Serializable] public class FaceAttributes{ public int age = 55; }

errorメッセージ

ArgumentException: JSON must represent an object type. UnityEngine.JsonUtility.FromJson (System.String json, System.Type type) (at /Users/builduser/buildslave/unity/build/Modules/JSONSerialize/Public/JsonUtility.bindings.cs:50) UnityEngine.JsonUtility.FromJson[T] (System.String json) (at /Users/builduser/buildslave/unity/build/Modules/JSONSerialize/Public/JsonUtility.bindings.cs:33) PlayerInfo.CreateFromJSON (System.String jsonString) (at Assets/Scripts/PlayerInfo.cs:11) OpenCVForUnityExample.FaceDetectionWebCamTexture+<MakeAnalysisRequest>d__22.MoveNext () (at Assets/Scripts/FaceDetectionWebCamTexture.cs:220) --- End of stack trace from previous location where exception was thrown --- System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () (at <>:0) System.Runtime.CompilerServices.AsyncMethodBuilderCore+<>c.<ThrowAsync>b__6_0 (System.Object state) (at <>:0) UnityEngine.UnitySynchronizationContext+WorkRequest.Invoke () (at /Users/builduser/buildslave/unity/build/Runtime/Export/UnitySynchronizationContext.cs:111) UnityEngine.UnitySynchronizationContext.Exec () (at /Users/builduser/buildslave/unity/build/Runtime/Export/UnitySynchronizationContext.cs:72) UnityEngine.UnitySynchronizationContext.ExecuteTasks () (at /Users/builduser/buildslave/unity/build/Runtime/Export/UnitySynchronizationContext.cs:93)

格納したいJson文字列データ

[{"faceId":"12345-678","faceRectangle":{"top":10,"left":20,"width":30,"height":30},"faceAttributes":{"age":55.0}}]

ネットで半日ほど調べたのですが同じような事例は(英語で)いくつかあるのですが
正しい答えを見つけることができません。どこをどのように修正したらいいのか分かる方教えて下さい。

環境)
PC: mac
Unity2018.2
言語:C#

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

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

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

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

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

papinianus

2019/02/05 04:39

FaceDetectionWebCamTexture.csの219行で発生しているようなのですが、staticからstaticでないメソッド呼んでいませんか?とりあえず、該当箇所を含む関連部分を開示してください
navesanta

2019/02/05 06:34

219行目は Debug.Log(GetComponent<PlayerInfo>().CreateFromJSON(contentString)); です。 >staticからstaticでないメソッド呼んでいませんか? static async void MakeAnalysisRequest()内に PlayerInfo.CreateFromJSON()の呼び出しを記述しているのでまさに その通りです。 初歩的な質問で申し訳ないですがstaticからstaticでないメソッド呼びだすことは できないのでしょうか?
papinianus

2019/02/05 08:36

その書き変えたエラーに対応するには、json文字列の内容を知る必要があります。[]がついている、キーがクラスに対応していないなどが考えられますが。
navesanta

2019/02/05 08:48

json文字列の内容を追加しました。よろしくお願いします。
papinianus

2019/02/05 08:50

[]がついている、でしたね。読んでました。回答のほうに追記してます。
guest

回答4

0

static な MakeAnalysisRequest() の中で参照している
Debug.Log(GetComponent<PlayerInfo>().CreateFromJSON(contentString));
の部分が気になりますね…
この GetComponent<PlayerInfo>() は this.GetComponent<PlayerInfo>() の事ですがこれを実行しているメソッドがstaticなのでthisを求められても困る…という事ではないんでしょうか?

投稿2019/02/05 07:36

HiroshiWatanabe

総合スコア2160

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

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

navesanta

2019/02/05 07:49

確かに仰る通りです。勘違いしていました。 CreateFromJSON()をstaticメソッドにした場合 MakeAnalysisRequest()内でどのようによびだせばいいか ちょっと悩んでいます。
HiroshiWatanabe

2019/02/05 08:03

PlayerInfo の CreateFromJSON() を static にするのなら PlayerInfo.CreateFromJSON() で呼び出せそうですけど…
navesanta

2019/02/05 09:12

CreateFromJsonをstaticにしてJsonデータをTrimしたら解決しました。回答ありがとうございました。これからもよろしくお願いします。
guest

0

ベストアンサー

JsonUtility.FromJson<PlayerInfo>はstringからPlayerInfo型を作って返してくれるやつなのでCreateFromJSON()メソッドはstaticでいいのでは?

実際この中でthisは参照してないでしょう?
(LogでfaceIdとかしてるけど、それってreturnされるやつのIdじゃないから無意味では?)

たとえばこういう感じかなーというのを。

csharp

1 public static PlayerInfo CreateFromJSON(string jsonString){ 2 var playerInfo2 = JsonUtility.FromJson<PlayerInfo>(jsonString); 3 Debug.Log("playerInfo2.faceId:" + playerInfo2.faceId); 4 Debug.Log("playerInfo2.faceRactangle.top:" + playerInfo2.faceRactangle.top); 5 Debug.Log("playerInfo2.faceRactangle.left:" + playerInfo2.faceRactangle.left); 6 Debug.Log("playerInfo2.faceRactangle.width:" + playerInfo2.faceRactangle.width); 7 Debug.Log("playerInfo2.faceRactangle.height:" + playerInfo2.faceRactangle.height); 8 Debug.Log("playerInfo2.faceAttributes:" + playerInfo2.faceAttributes.age); 9 return playerInfo2; 10 } 11 12呼び出しは 13Debug.Log(PlayerInfo.CreateFromJSON(jsonString));//GetComponentとか不要

投稿2019/02/05 07:57

編集2019/02/05 08:13
papinianus

総合スコア12705

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

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

navesanta

2019/02/05 08:44

早速変更しました(上記2つのコードも修正しました) コード入力時のエラーはなくなりましたがコンパイル時にエラーが出ます。 今度はArgumentException: JSON must represent an object type.です。 ちなみに格納したい参照しているJSON文字列も掲載しておきます。
papinianus

2019/02/05 08:48

[]があるせいです。trimしましょう。 `CreateFromJSON(contentString.Trim(new [] { '[', ']',}));`
navesanta

2019/02/05 09:08

trimしたらできました。 ありがとうございます。これからもよろしくお願いします。
guest

0

こんにちは。

Component.GetComponent<PlayerInfo>()Componentってもしかしてクラス名だったりしません?
GetComponent<T>()はインスタンスメソッドに見えるのでその呼び出しは不正だと思います。
自分自身のコンポーネントを取得するならthis.GetComponent<PlayerInfo>()とかじゃないでしょうか。

投稿2019/02/05 07:18

tamoto

総合スコア4105

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

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

navesanta

2019/02/05 07:41

this.GetComponent<PlayerInfo>()とやりたいのですが PlayerInfoクラスはJsonデータを格納するためのJsonUtility.FromJson()を 使うクラスなので、MonoBehavirourを継承できません。 MonoBehavirourを継承していないためObjectにアタッチできません。 しかし仰る通りエラーメッセージも「オブジェクトへの参照が必要」と言っているので そこの部分がコアのような気がします。 もしかしたらこういうJsonUtility.FromJson()のようなメソッドは staticメソッドにしなければいけないのかもと思えてきました。 もうちょっと調べててみます。
tamoto

2019/02/05 08:48

エラーの行`Component.GetComponent<>()`の部分では、`Component`という名前のインスタンスが存在していますか? 表題のエラーはインスタンスメソッドをスタティックメソッドのように呼び出したときのエラーです。 GetComponentを呼ぶとき「どこからGetするのか」はあなたが知っているはずですから、正しいインスタンスを指定してください。
tamoto

2019/02/05 08:55

質問欄見落としてました、CreateFromJsonの呼び方の問題でしたか。
navesanta

2019/02/05 09:09

CreateFromJsonをstaticにしてJsonデータをTrimしたら解決しました。回答ありがとうございました。これからもよろしくお願いします。
guest

0

"An object reference is required for the non-static field, method,
or property 'Component.GetComponent<PlayerInfo>()'"
[直訳]「スタティックではないフィールドやメソッド、プロパティを使うには、オブジェクトへの参照が必要です」というエラーメッセージが出ていて、「'Component.GetComponent<PlayerInfo>()'」という箇所が指摘されているのですから、変数Componentが初期化されていない(値が入っていない)というような事が起きているのではないかと思われます。

『普通のメソッドとstaticメソッドが混在していて』も正しく使えば問題ありません。
普通のフィールドやメソッド、プロパティの使い方と、staticなフィールドやメソッド、プロパティの使い方が区別できていなくて、間違えた使い方をしている事が問題なのです。

質問に書かれているコードで"static"が含まれているのは「static async void MakeAnalysisRequest(byte[] byteData){」の行だけですが、エラーメッセージとの関連が有りそうに思えないので、問題は質問に書かれていないコードの部分で生じていると思われます。

このままでは、問題のある個所のコードが示されていないために誰にも回答できない質問の可能性が高そうに思われます。

投稿2019/02/05 04:55

coco_bauer

総合スコア6915

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

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

navesanta

2019/02/05 06:36

全部確認しましたがstaticを使っているのは static async void MakeAnalysisRequest(byte[] byteData)の部分だけです。 後は全部普通にnewしてインスタンスを作成するタイプのメソッドです。 よろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問