🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

ビルド

ソースコードを単体で実行可能なソフトウェアへ変換する過程をビルド(build)と呼びます

Unity

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

Q&A

解決済

4回答

4251閲覧

エラーコードCS0165の対応・ローカル変数の初期化

Nakosu

総合スコア2

C#

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

ビルド

ソースコードを単体で実行可能なソフトウェアへ変換する過程をビルド(build)と呼びます

Unity

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

0グッド

0クリップ

投稿2021/03/14 02:50

編集2021/03/14 10:57

Unity 2019.3.12f1を使用しています。
ビルドエラーCS0165で「未割り当てのローカル変数 'animation' の使用」と出てしまいました。

エラー箇所のコードの前後です。

private AnimationClip ParameterToAnimationClip(Image image, string[] parameters) { string[] ps = parameters[0].Replace(" ", "").Split(','); string path = animationsDirectory + SceneManager.GetActiveScene().name + "/" + image.name; AnimationClip prevAnimation = Resources.Load<AnimationClip>(path + "/" + ps[0]); AnimationClip animation; #if UNITY_EDITOR if (ps[3].Equals("Replay") && prevAnimation != null) return Instantiate(prevAnimation); animation = new AnimationClip(); Color startcolor = image.color; Vector3[] start = new Vector3[3]; start[0] = image.GetComponent<RectTransform>().sizeDelta; start[1] = image.GetComponent<RectTransform>().anchoredPosition; Color endcolor = startcolor; if (parameters[1] != "") endcolor = ParameterToColor(parameters[1]); Vector3[] end = new Vector3[3]; for (int i = 0; i < 2; i++) { if (parameters[i + 2] != "") end[i] = ParameterToVector3(parameters[i + 2]); else end[i] = start[i]; } AnimationCurve[,] curves = new AnimationCurve[4, 4]; if (ps[3].Equals("EaseInOut")) { curves[0, 0] = AnimationCurve.EaseInOut(float.Parse(ps[1]), startcolor.r, float.Parse(ps[2]), endcolor.r); curves[0, 1] = AnimationCurve.EaseInOut(float.Parse(ps[1]), startcolor.g, float.Parse(ps[2]), endcolor.g); curves[0, 2] = AnimationCurve.EaseInOut(float.Parse(ps[1]), startcolor.b, float.Parse(ps[2]), endcolor.b); curves[0, 3] = AnimationCurve.EaseInOut(float.Parse(ps[1]), startcolor.a, float.Parse(ps[2]), endcolor.a); for (int i = 0; i < 2; i++) { curves[i + 1, 0] = AnimationCurve.EaseInOut(float.Parse(ps[1]), start[i].x, float.Parse(ps[2]), end[i].x); curves[i + 1, 1] = AnimationCurve.EaseInOut(float.Parse(ps[1]), start[i].y, float.Parse(ps[2]), end[i].y); curves[i + 1, 2] = AnimationCurve.EaseInOut(float.Parse(ps[1]), start[i].z, float.Parse(ps[2]), end[i].z); } } else { curves[0, 0] = AnimationCurve.Linear(float.Parse(ps[1]), startcolor.r, float.Parse(ps[2]), endcolor.r); curves[0, 1] = AnimationCurve.Linear(float.Parse(ps[1]), startcolor.g, float.Parse(ps[2]), endcolor.g); curves[0, 2] = AnimationCurve.Linear(float.Parse(ps[1]), startcolor.b, float.Parse(ps[2]), endcolor.b); curves[0, 3] = AnimationCurve.Linear(float.Parse(ps[1]), startcolor.a, float.Parse(ps[2]), endcolor.a); for (int i = 0; i < 2; i++) { curves[i + 1, 0] = AnimationCurve.Linear(float.Parse(ps[1]), start[i].x, float.Parse(ps[2]), end[i].x); curves[i + 1, 1] = AnimationCurve.Linear(float.Parse(ps[1]), start[i].y, float.Parse(ps[2]), end[i].y); curves[i + 1, 2] = AnimationCurve.Linear(float.Parse(ps[1]), start[i].z, float.Parse(ps[2]), end[i].z); } } string[] b1 = { "r", "g", "b", "a" }; for (int i = 0; i < 4; i++) { AnimationUtility.SetEditorCurve( animation, EditorCurveBinding.FloatCurve("", typeof(Image), "m_Color." + b1[i]), curves[0, i] ); } string[] a = { "m_SizeDelta", "m_AnchoredPosition" }; string[] b2 = { "x", "y", "z" }; for (int i = 0; i < 2; i++) { for (int j = 0; j < 3; j++) { AnimationUtility.SetEditorCurve( animation, EditorCurveBinding.FloatCurve("", typeof(RectTransform), a[i] + "." + b2[j]), curves[i + 1, j] ); } } if (!Directory.Exists("Assets/Resources/" + path)) Directory.CreateDirectory("Assets/Resources/" + path); AssetDatabase.CreateAsset(animation, "Assets/Resources/" + path + "/" + ps[0] + ".anim"); AssetDatabase.ImportAsset("Assets/Resources/" + path + "/" + ps[0] + ".anim"); #elif UNITY_STANDALONE animation = prevAnimation; #endif return Instantiate(animation); }

の最後のanimationでエラーが出てしまいました。
animationのローカル変数が初期化されていないらしいのですが、どう書けばいいのか分かりません。

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

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

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

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

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

y_waiwai

2021/03/14 03:54

このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
y_waiwai

2021/03/14 04:52

その関数だけでも全体を提示しましょう。 一部分ではどーにもできません
guest

回答4

0

if文の前のコードがないのでわかりませんが、'animation'を宣言だけして'AssetDatabase.CreateAsset'で使用していませんか?
'animation = prevAnimation;'が初めての代入だったりしません?

投稿2021/03/14 08:31

legohasiri

総合スコア40

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

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

0

既に指摘がありますが、animationの使用箇所のリストアップ。(ま、ほんとにリストにする必要は無いが、、)
そして、処理の流れとして、animationに値がセットされない流れが無いかの確認ですね。提示のコード範囲では、一見、値がセットされているようですが、条件コンパイルの中なので、コンパイル条件次第では、未定義になります。

また、ローカル変数との事なので、宣言時に初期値を与えましょう。

投稿2021/03/14 08:04

pepperleaf

総合スコア6385

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

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

0

変数に値が設定されないまま使用されると、そのエラーが出ます
そのif文が成立した場合に、animationに値が設定されませんね

投稿2021/03/14 03:56

y_waiwai

総合スコア88038

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

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

0

ベストアンサー

条件を見ると、#if UNITY_EDITOR#elif UNITY_STANDALONEのいずれかの条件を満たしている場合はそれぞれanimation = new AnimationClip();animation = prevAnimation;にて値が代入されていますが、いずれの条件も満たせない場合はAnimationClip animation;の次に実行される行はreturn Instantiate(animation);となるため、未割り当てのローカル変数 'animation' の使用となってしまいますね
#elseのルートを用意してあげないといけません

投稿2021/03/14 14:12

len_souko

総合スコア1363

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問