ちょっと気になるご質問だったので調べてみましたが、すみませんがこれだという情報は得られませんでした...
エディタ上での制作中にはAssets内の好きなプレハブへの参照をセットすることができますが、ビルドしたプログラムにおいては、使いたい各種プレハブはResources
内に仕込んでおいたり、アセットバンドルとして供給したり、あるいはシーン上にあらかじめ全種類こっそり配置しておくなど工夫してやらないと、そもそもプレハブが存在せずアクセスできないかと思います。
Resources
を使わない...という制限は破ってしまいましたが、下記のようにResources
へのアクセスをメソッド内に隠してしまい、メソッドを使う側からは直接プレハブ参照を保存・復元しているように見せかけるのはどうでしょうか?
C#
1using System.Collections;
2using UnityEngine;
3
4public class Spawner : MonoBehaviour
5{
6 public GameObject FruitPrefab;
7
8 // 「SavePrefab」という名前だが、実際には...
9 private static void SavePrefab(GameObject prefab)
10 {
11 // ...与えられたプレハブの名前だけをPlayerPrefsに保存する
12 var prefabName = prefab == null ? string.Empty : prefab.name;
13 PlayerPrefs.SetString("PrefabName", prefabName);
14 PlayerPrefs.Save();
15 }
16
17 // 「LoadPrefab」という名前だが、実際には...
18 private static GameObject LoadPrefab()
19 {
20 // PlayerPrefsに保存されている名前と同名のプレハブをResourcesからロードして返す
21 var prefabName = PlayerPrefs.GetString("PrefabName");
22 return string.IsNullOrEmpty(prefabName) ? null : Resources.Load<GameObject>("Prefabs/" + prefabName);
23 }
24
25 private void OnApplicationQuit()
26 {
27 SavePrefab(this.FruitPrefab);
28 }
29
30 private IEnumerator Start()
31 {
32 this.FruitPrefab = LoadPrefab();
33 while (true)
34 {
35 yield return new WaitWhile(() => this.FruitPrefab == null);
36
37 var fruit = Instantiate(
38 this.FruitPrefab,
39 this.transform.position,
40 Quaternion.Euler(0.0f, 0.0f, Random.value * 360.0f));
41 fruit.name = this.FruitPrefab.name;
42 Destroy(fruit, 10.0f);
43 yield return new WaitForSeconds(3.0f);
44 }
45 }
46}
ご質問者さんのご要望の通りの動作ではなくて申し訳ないですが、使いたいプレハブはAssets/Resources/Prefabsに入れておいて...
終了時にプレハブ名を保存して、次回起動時にその名前のプレハブをロードしてセットすれば、プレハブへの参照を保存しているかのように見えませんかね...?
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/18 02:47