回答編集履歴

1

マークダウン修正、文章の一部修正

2018/04/18 21:06

投稿

Bongo
Bongo

スコア10807

test CHANGED
@@ -1,12 +1,12 @@
1
1
  おそらく、ご提示のスクリプトをそのまま使うと「You are trying to create a MonoBehaviour using the 'new' keyword. This is not allowed. 〜」などと言われるかと思います。この状態で「a」キーや「d」キーを押すと、「NullReferenceException」と言われるはずです。
2
2
 
3
- これは、移動処理を実行しようとしている`Move`オブジェクトはUnityが自動的に作ったものではなく`Player_move`クラス内で独自に生成したものであるので、どのゲームオブジェクトにも関連付けられていない状態にあるためでしょう。
3
+ これは、移動処理を実行しようとしている`Move`オブジェクトはUnityが自動的に作ったものではなく`Player_move`クラス内で独自に生成したものであるので、どのゲームオブジェクトにも関連付けられていない状態にあり、有効な`transform`が存在しない状態になっているためでしょう。
4
4
 
5
5
 
6
6
 
7
- そこで、[new演算子](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/new-operator)で`Move`を生成する代わりに、Unityが用意してくれている[AddComponent](https://docs.unity3d.com/jp/current/ScriptReference/GameObject.AddComponent.html)を使ってMoveを生成、およびゲームオブジェクトへのアタッチを行ってはいかがでしょう。
7
+ そこで、[new演算子](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/new-operator)で`Move`を生成する代わりに、Unityが用意してくれている[AddComponent](https://docs.unity3d.com/jp/current/ScriptReference/GameObject.AddComponent.html)を使って`Move`を生成、およびゲームオブジェクトへのアタッチを行ってはいかがでしょう。
8
8
 
9
- ただし、現在の状態で`Move move = new Move();`をそのまま`Move move = gameObject.AddComponent<Move>();`としてしまうと、毎フレームMoveの生成・アタッチが行われてしまい、インスペクタを見てみるとMoveコンポーネントがどんどん増えていくという事態になるかと思います。
9
+ ただし、現在の状態で`Move move = new Move();`をそのまま`Move move = gameObject.AddComponent<Move>();`としてしまうと、毎フレーム`Move`の生成・アタッチが行われてしまい、インスペクタを見てみるとMoveコンポーネントがどんどん増えていくという事態になるかと思います。
10
10
 
11
11
  代わりに、たとえば下記のような形で`Player_move`の`Start`内で`Move`の生成・アタッチを一度だけ行う方式のほうがよさそうです。
12
12