質問するログイン新規登録
C#

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

JSON

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

Unity3D

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

Unity

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

Q&A

解決済

1回答

1667閲覧

NullReferenceException: Object reference not set to an instance of an object を解決したいです

mio

総合スコア1

C#

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

JSON

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

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2022/03/02 12:30

編集2022/03/03 05:14

0

0

※ 解決済 始めての質問となります、宜しくお願い致します。
現在Json内にある頂点情報(移動、回転、スケール)をUnityで動くようにC#スクリプトで変換してキャラクターへの表情付けを実行したいのですが、下記のエラーを吐いてしまって上手く機能してくれません。

皆様のお知恵をどうか一つお貸しください。宜しくお願い致します。!

エラーメッセージ

イメージ説明

コード

using System.Collections.Generic; using UnityEngine; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections; public class 表情抽出ツール : MonoBehaviour { public TextAsset FacialTarget; public List<Transform> objs = new List<Transform>(); private List<Vector3> oriTrans = new List<Vector3>(); private List<Quaternion> oriRots = new List<Quaternion>(); private List<Vector3> oriScal = new List<Vector3>(); public List<Morph> morphs = new List<Morph>(); public SkinnedMeshRenderer faceMesh; public SkinnedMeshRenderer eyebrowMesh; string[] typeList = new string[] { "_eyebrowTarget", "_eyeTarget", "_mouthTarget" }; [Range(0, 200)] public int show; int curShow; void Start() { if (FacialTarget == null) { Debug.LogError("表情アニメーションのデータがありません!"); return; } objs.AddRange(GetComponentsInChildren<Transform>()); foreach (Transform g in objs) { oriTrans.Add(g.localPosition); oriRots.Add(g.localRotation); oriScal.Add(g.localScale); } foreach (SkinnedMeshRenderer s in GetComponentsInChildren<SkinnedMeshRenderer>()) { if (s.name.Contains("Face")) faceMesh = s; if (s.name.Contains("Mayuge")) eyebrowMesh = s; } JObject jObject = (JObject)JsonConvert.DeserializeObject(FacialTarget.text); if (jObject == null) return; for (int f = 0; f < typeList.Length; f++) { JArray jArray = (JArray)jObject[typeList[f]]; for (int i = 0; i < jArray.Count; i++) { JArray Group = (JArray)jArray[i]["_faceGroupInfo"]; for (int j = 0; j < Group.Count; j++) { Morph morph = new Morph(); morph.type = (Morph.morphType)f; JArray facegroup = (JArray)Group[j]["_facegroup"]; for (int n = 0; n < facegroup.Count; n++) { Bone bone = new Bone(); bone.Bonename = facegroup[n]["_path"].ToString(); bone.pos = new Vector3(Convert.ToSingle(facegroup[n]["_position"]["x"]), Convert.ToSingle(facegroup[n]["_position"]["y"]), Convert.ToSingle(facegroup[n]["_position"]["z"])); bone.rot = new Vector3(Convert.ToSingle(facegroup[n]["_rotation"]["x"]), Convert.ToSingle(facegroup[n]["_rotation"]["y"]), Convert.ToSingle(facegroup[n]["_rotation"]["z"])); bone.sca = new Vector3(Convert.ToSingle(facegroup[n]["_scale"]["x"]), Convert.ToSingle(facegroup[n]["_scale"]["y"]), Convert.ToSingle(facegroup[n]["_scale"]["z"])); bone.isValidScale = (int)facegroup[n]["_isValidScaleTransform"] == 1; //bone.isOverride = (int)facegroup[n]["IsOverrideTarget"] == 1; if (i == 0) { bone.isOverride = true; morph.name = ((Morph.morphType)f).ToString() + "_Base" + (Group.Count < 2 ? "" : (j == 0 ? "_R" : "_L")); } else morph.name = ((Morph.morphType)f).ToString() + "_" + i + (Group.Count < 2 ? "" : (j == 0 ? "_R" : "_L")); morph.bones.Add(bone); } morphs.Add(morph); } } } RecordBlendshape(); } private void Update() { if (curShow == show) { curShow = show; if (curShow <= morphs.Count) { if (curShow == 0) { FacialReset(); } else { ChangeMorph(morphs[curShow - 1]); } } } } public void ChangeMorph(Morph morph) { FacialReset(); foreach (Bone bone in morph.bones) { var tran = objs.Find(ani => ani.name.Equals(bone.Bonename)); if (tran) { if (bone.isOverride) { tran.localRotation = Quaternion.Euler(bone.rot); tran.localPosition = bone.pos; tran.localScale = bone.sca; } else { var tmp = tran.localRotation.eulerAngles; tmp += bone.rot; tran.localRotation = Quaternion.Euler(tmp); tran.localPosition += bone.pos; tran.localScale += bone.sca; } } } } private void RecordBlendshape() { eyebrowMesh.sharedMesh.ClearBlendShapes(); faceMesh.sharedMesh.ClearBlendShapes(); foreach (Morph m in morphs) { ChangeMorph(m); switch (m.type) { case Morph.morphType.EyeBrow: case Morph.morphType.Eye: case Morph.morphType.Mouth: Mesh facemesh = new Mesh(); faceMesh.BakeMesh(facemesh); faceMesh.sharedMesh.AddBlendShapeFrame(m.name, 1, CalDelta(faceMesh.sharedMesh.vertices, facemesh.vertices), CalDelta(faceMesh.sharedMesh.normals, facemesh.normals), CalDelta(Vec4ToVec3(faceMesh.sharedMesh.tangents), Vec4ToVec3(facemesh.tangents))); break; } FacialReset(); } } public void FacialReset() { for (int i = 0; i < objs.Count; i++) { objs[i].localPosition = oriTrans[i]; objs[i].localRotation = oriRots[i]; objs[i].localScale = oriScal[i]; } } public Vector3[] Vec4ToVec3(Vector4[] vector4s) { Vector3[] tmp = new Vector3[vector4s.Length]; for (int i = 0; i < vector4s.Length; i++) { tmp[i] = new Vector3(vector4s[i].x, vector4s[i].y, vector4s[i].z); } return tmp; } public Vector3[] CalDelta(Vector3[] ori, Vector3[] end) { Vector3[] tmp = new Vector3[ori.Length]; for (int i = 0; i < ori.Length; i++) { tmp[i] = end[i] - ori[i]; } return tmp; } } [Serializable] public class Morph { public int index; public string name; public enum morphType { EyeBrow, Eye, Mouth } public morphType type; public List<Bone> bones = new List<Bone>(); } [Serializable] public class Bone { public string Bonename; public bool isValidScale; public bool isOverride; public Vector3 pos, rot, sca; }

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/03/02 22:21

Unity のタグを付けてください。
mio

2022/03/02 22:43

了解しました!
guest

回答1

0

ベストアンサー

以下の eyebrowMesh, faceMesh, eyebrowMesh.sharedMesh, faceMesh.sharedMesh あたりが null なのでしょう。

csharp

1eyebrowMesh.sharedMesh.ClearBlendShapes(); 2faceMesh.sharedMesh.ClearBlendShapes();

コードはどうやら eyeblowMesh とか faceMesh を Inspector からアサインするように書かれていますが、それがアサインされていないんだと思います。

もしアサインされているなら、その eyeblowMesh とか faceMesh が Mesh を持っていないのでしょう。それはつまりコードを作った人の意図していない SkinnedMeshRenderer をアサインしているということです。

また、以下の処理は意図がよくわかりません。

csharp

1foreach (SkinnedMeshRenderer s in GetComponentsInChildren<SkinnedMeshRenderer>()) 2{ 3 if (s.name.Contains("Face")) faceMesh = s; 4 if (s.name.Contains("Mayuge")) eyebrowMesh = s; 5}

Inspector から eyebrowMesh, faceMesh をアサインするならここで無理やり置き換えられてしまいます。
もし Inspector からアサインせずここで SkinnedMeshRenderer を取ってくるつもりなら、そういう名前の SkinnedMeshRenderer が見つからなかったので null のままになったのでしょう。

投稿2022/03/02 12:49

bboydaisuke

総合スコア5339

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

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

mio

2022/03/02 12:59

ありがとうございます!理解まで少し時間がかかりそうですが、回答をもとにもう一度試してみます!
bboydaisuke

2022/03/02 13:04

どんなモデルに対して実行しているかわからないのでまったくの勘ですが、"Mayuge" という名前の(眉毛のメッシュを描画している)オブジェクトがないんでしょうね。
mio

2022/03/03 02:48 編集

このコメントは削除されました
bboydaisuke

2022/03/03 03:55 編集

"Face", "Mayuge" というオブジェクトが「存在する」ことは画像でわかったのですが、肝心なのはそれらに 「SkinnedMeshRenderer がアタッチされているか」どうかです。本当は "Mayu_0" に SkinnedMeshRenderer がアタッチされていたりしませんか? しかし、名前で判定するくらいならインスペクターから指定してしまった方がいいんじゃないの?と思います。
bboydaisuke

2022/03/03 03:54

あと「構文」という用語の意味を取り違えているようです。読んでいる人も意味を取り違えてしまうのではないでしょうか。
mio

2022/03/03 05:10 編集

そうですね、質問欄の場所を修正しておきます。 アドバイス通りにMayu_0にアサインし直したら、メッシュが存在しないというエラーは完全に消えました!! しかし、追加されたはずのブレンドシェイプのスライダーを動かしても上手く機能してくれないので、もう少し全体のコードを見直してみます! 回答者さんのおかげで原因は突き止められたので、あとは自分の力で頑張ってみます!
bboydaisuke

2022/03/03 05:02 編集

> アドバイス通りにMayu_0にアサインし直したら、メッシュが存在しないというエラーは完全に消えました!! 今回の問題は、「このプログラムを書いた人」は「眉毛の SkinnedMeshRenderer のオブジェクト名は "Mayuge" である」と考えていたのに、「モデルを作った人」は「眉毛の SkinnedMeshRenderer のオブジェクトに "Mayu_0" と名付けた」という食い違いが元で起きています。
mio

2022/03/03 05:10

三日間寝るにも寝られず、ストレスで死んでしまいそうな毎日でしたが、回答者さんのおかげでようやく解放されました! 同時に問題へ取り組む際の粘り強さも手に入れられたので一石二鳥です!! 本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問