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

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

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

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

ビルド

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

Unity

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

Q&A

解決済

1回答

1770閲覧

Unity ScriptableObjectを使用したシーン間のデータ共有について

groggy_egg

総合スコア24

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

ビルド

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

Unity

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

0グッド

0クリップ

投稿2020/09/16 02:56

経緯

  • シーン間のデータ共有をする方法を探していたところ下記を発見

参考1
参考2
スクリプト作成後、エディターからassetファイルを作成

  • 上記のページを参考にしたがassetファイルにデータが記録されなかったためこちらを参照

ScriptableObjectを使ったスクリプト

C#

1using UnityEditor; 2 3[CreateAssetMenu(fileName ="SettingData",menuName ="SettingData")] 4public class SettingData : ScriptableObject 5{ 6 7 //音量設定をセーブ 8 public static void saveVolume(SettingData data) 9 { 10 PlayerPrefs.SetFloat(VOL_SE, data.volSE); 11 PlayerPrefs.SetFloat(VOL_BGM, data.volBGM); 12 PlayerPrefs.Save(); 13 saveSettingData(data); 14 } 15 16 //設定データの保存 17 public static void saveSettingData(SettingData data) 18 { 19 EditorUtility.SetDirty(data); 20 AssetDatabase.SaveAssets(); 21 } 22 23}

※アプリ終了後もデータを保持するためにPlayerPrefsでデータを保存しています。

ScriptableObjectを利用する側

C#

1public class UseSettingData : MonoBehaviour 2{ 3 [SerializeField] SettingData data; 4 //音量を設定 5 public void setVolume(float se,float bgm) 6 { 7 data.volSE = se; 8 data.volBGM = bgm; 9 SettingData.saveVolume(data); 10 } 11 //音量を取得 12 public float getVolumeSE() 13 { 14 return data.volSE; 15 } 16}

GameObjectに上記スクリプトをアタッチしInspectorからassetファイルを選択しています。


  • ビルド時にエラー発生
error CS0103: The name 'EditorUtility' does not exist in the current context EditorUtility.SetDirty(data); <-該当箇所のコード --------------------------- error CS0103: The name 'AssetDatabase' does not exist in the current context AssetDatabase.SaveAssets(); <-該当箇所のコード --------------------------- Error building Player because scripts had compiler errors ------------------------------- Build completed with a result of 'Failed' in 9 seconds (9333 ms) UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr) ------------------------------- UnityEditor.BuildPlayerWindow+BuildMethodException: 4 errors at UnityEditor.BuildPlayerWindow+DefaultBuildMethods.BuildPlayer (UnityEditor.BuildPlayerOptions options) [0x002bb] in <8004fcc221b54f98ba547350ea71d812>:0 at UnityEditor.BuildPlayerWindow.CallBuildMethods (System.Boolean askForBuildLocation, UnityEditor.BuildOptions defaultBuildOptions) [0x00080] in <8004fcc221b54f98ba547350ea71d812>:0
  • 過去質問より該当スクリプトをEditorフォルダに移動

Editorフォルダ内に移動したScriptableObjectを使用しているスクリプトが見つからないエラー
error CS0246: The type or namespace name 'SettingData' could not be found (are you missing a using directive or an assembly reference?)

  • 上記スクリプトと関連スクリプトもエラーになるので関連するもの全てEditorフォルダに移動

エラーが消えたので実行→成功

  • ビルドして実機テストすると実機側でエラー

the referenced script on this Behavior is missing!

UnityEditorのInspectorで確認するとScriptに下記のWarning(黄色△!)が表示されている
the associated script can not be loaded please fix any compile errors and assign a valid script

  • スクリプトをRemoveComponentして再アタッチしようとしたところ

Can't add script behavior UIAction. the script needs to derive from MonoBehavior
のWarningダイアログが表示される

  • ReimportAllして再度アタッチしようとしたところ

the script is an editor script
のWarningダイアログが表示される

  • 再度上記の過去質問に行きつきよくよく目を通してみると

UnityEditorを使っているコードはエディタ専用、Editorフォルダに入れる ビルド後の環境ではUnityEditorの機能はコンパイルが通っても動作しない
とのことなのですが


  1. AndroidアプリでScriptableObjectは使用できない(動作しない)のか
  2. 単純にやり方が間違っているのか(どうすればできるのか)
  3. Editorフォルダに移動したスクリプトのnot foundの対処方法が間違っているのか
  4. その他

詳しい方アドバイスお願いします

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

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

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

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

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

guest

回答1

0

ベストアンサー

EditorUtilityAssetDatabaseも、Unity Editor上でしか動かないからです。

下記リファレンスの「class in UnityEditor」の記載がある通り、エディタ上で動くものです。
https://docs.unity3d.com/ja/current/ScriptReference/EditorUtility.html
https://docs.unity3d.com/ja/current/ScriptReference/AssetDatabase.html

流し読みですが、設定データを利用したいだけなんですよね? ScriptableObjectを使う理由はありますか?
ScriptableObjectはどちらかというとマスターデータみたいなものを取り扱うのに向いていると思います。(エネミーデータとか)

愚直にやるならPlayerPrefs.GetFloat()とかで数値を読み取っても良いですし、外部ファイルに書き込むならJSONとかで保存しちゃって読み書きするほうが扱いやすいかなと思うのですが、どうでしょう?

投稿2020/09/16 06:16

編集2020/09/16 06:18
hogefugapiyo

総合スコア3302

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

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

groggy_egg

2020/09/16 06:48

>設定データを利用したいだけなんですよね? おっしゃる通りです。 >マスターデータみたいなものを取り扱うのに向いている ということは使うこと自体はできるのでしょうか? 今後のために間違いなどご指摘いただけるとありがたいです。 >愚直にやるならPlayerPrefs.GetFloat()とかで数値を読み取っても良いですし、 >外部ファイルに書き込むならJSONとかで保存しちゃって読み書きするほうが扱いやすいかな 他の設定データもあり項目数があるのでPlayerPrefsではなくまとめて扱えるものを探していました。 JSONは使ったことがなかったのですが試してみようと思います。
groggy_egg

2020/09/17 00:58

私が調べたサイトよりわかりやすくてありがたいです。 >ScriptableObjectはマスターデータ(ゲーム中に変更されないデータ)に向いています。 私のコードもしくはファイルの配置ではアクセスできなかったりエラーになったりするのですが どこがおかしいのでしょうか? よろしければご教授願います。 (冗長であれば別質にします)
hogefugapiyo

2020/09/17 02:32

最初の回答で答えたとおり今回のコードで原因となるのは、UnityEditor上でしか使えない下記2コードです。Editorフォルダに含まれるファイルはビルド時に含まれないので「無いものを利用しようとする」ことでビルドエラーが起きます ・EditorUtility.SetDirty(data); ・AssetDatabase.SaveAssets(); 下記サイトで敵データをScriptableObjectで実装しながら解説しているのでご参考までに https://ekulabo.com/about-scriptable-object
groggy_egg

2020/09/17 12:11

重ね重ね返答ありがとうございます。 シーン間のデータ移行も無事で来ました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問