teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

修正

2020/07/13 13:35

投稿

IShix
IShix

スコア1729

answer CHANGED
@@ -13,7 +13,8 @@
13
13
  [`Awake`] 生成された時走る(クラスに`[CreateAssetMenu]`アトリビュートをアタッチし右クリック > Create > スクリプト名で生成する時や既に存在する`ScriptableObject`を複製した時スクリプトを修正した時)
14
14
  [`OnEnable`] ゲーム(ランタイム)中初めて読み込まれた時に1度だけ走る
15
15
 
16
+ `ScriptableObject`の`Awake`のみランタイムは関係ありません。
16
- `ScriptableObject`の`Awake`のみランタイムは関係ありません。生成後Project上に残り続けるデータだからです。メソッド名が同じなので混乱しますね。違う名前にして欲しかったです。
17
+ 生成後Project上に残り続けるデータだからです。メソッド名が同じなので混乱しますね。違う名前にして欲しかったです。
17
18
 
18
19
  ###今回の用件に合いそうなのはScriptableObject.OnEnable()
19
20
  `Awake()`を`OnEnable()`に書き換えれば求める挙動になります。1つ訂正する点があるとすれば`power`が`ScriptableObject`に書き込まれてしまうので下記のようにすると良いです。
@@ -40,11 +41,18 @@
40
41
  }
41
42
  ```
42
43
 
43
- ### (おまけ)イベントの実行順
44
+ ### イベントの実行順
44
45
 
45
- ヒエラルキーに設置したオブジェクト(`MonoBehaviour`)とアタッチしている`ScriptableObject`とういう条件比較です。
46
+ ヒエラルキーに設置したオブジェクト(`MonoBehaviour`)とアタッチしている`ScriptableObject`と想定すると下記実行順となります。
46
47
 
47
48
  1. ScriptableObject.OnEnable()
48
49
  2. MonoBehaviour.Awake()
49
50
  3. MonoBehaviour.OnEnable()
50
- 4. MonoBehaviour.Start()
51
+ 4. MonoBehaviour.Start()
52
+
53
+ ### 今回詳しく解説した理由
54
+ 今回の`power`は取得タイミングによって値が変わります。
55
+ `OnEnable`が走る前は0を返し、`OnEnable`が走った後は計算された値を返します。
56
+ こういうのをプログラム用語で「副作用がある」と言います。
57
+ 今回の説明で`OnEnable`で`power`に代入すれば**常に計算された値を取得できる**事が保証されているのが分かると思います。
58
+ 特に今回のような戻り値のあるもので副作用がある場合、バグになりやすいので徹底的に問題無いか調査するのをおすすめします。

1

修正

2020/07/13 13:35

投稿

IShix
IShix

スコア1729

answer CHANGED
@@ -13,7 +13,7 @@
13
13
  [`Awake`] 生成された時走る(クラスに`[CreateAssetMenu]`アトリビュートをアタッチし右クリック > Create > スクリプト名で生成する時や既に存在する`ScriptableObject`を複製した時スクリプトを修正した時)
14
14
  [`OnEnable`] ゲーム(ランタイム)中初めて読み込まれた時に1度だけ走る
15
15
 
16
- `ScriptableObject`の`Awake`のみランタイムは関係ありません。生成後、Project上に残り続けるデータなので生成た時のみ`Awake`が走ります。
16
+ `ScriptableObject`の`Awake`のみランタイムは関係ありません。生成後、Project上に残り続けるデータだからです。メソッド名が同じなので混乱します違う名前にして欲しかったです。
17
17
 
18
18
  ###今回の用件に合いそうなのはScriptableObject.OnEnable()
19
19
  `Awake()`を`OnEnable()`に書き換えれば求める挙動になります。1つ訂正する点があるとすれば`power`が`ScriptableObject`に書き込まれてしまうので下記のようにすると良いです。
@@ -42,7 +42,7 @@
42
42
 
43
43
  ### (おまけ)イベントの実行順
44
44
 
45
- ヒエラルキーに設置したオブジェクトとアタッチしている`ScriptableObject`とういう条件の比較です。
45
+ ヒエラルキーに設置したオブジェクト(`MonoBehaviour`)とアタッチしている`ScriptableObject`とういう条件の比較です。
46
46
 
47
47
  1. ScriptableObject.OnEnable()
48
48
  2. MonoBehaviour.Awake()