おそらく、ご提示のスクリプトをそのまま使うと「You are trying to create a MonoBehaviour using the 'new' keyword. This is not allowed. 〜」などと言われるかと思います。この状態で「a」キーや「d」キーを押すと、「NullReferenceException」と言われるはずです。
これは、移動処理を実行しようとしているMove
オブジェクトはUnityが自動的に作ったものではなくPlayer_move
クラス内で独自に生成したものであるので、どのゲームオブジェクトにも関連付けられていない状態にあり、有効なtransform
が存在しない状態になっているためでしょう。
そこで、new演算子でMove
を生成する代わりに、Unityが用意してくれているAddComponentを使ってMove
を生成、およびゲームオブジェクトへのアタッチを行ってはいかがでしょう。
ただし、現在の状態でMove move = new Move();
をそのままMove move = gameObject.AddComponent<Move>();
としてしまうと、毎フレームMove
の生成・アタッチが行われてしまい、インスペクタを見てみるとMoveコンポーネントがどんどん増えていくという事態になるかと思います。
代わりに、たとえば下記のような形でPlayer_move
のStart
内でMove
の生成・アタッチを一度だけ行う方式のほうがよさそうです。
C#
1public class Player_move : MonoBehaviour
2{
3 private Move move;
4
5 // Use this for initialization
6 void Start()
7 {
8 this.move = gameObject.AddComponent<Move>();
9 }
10
11 // Update is called once per frame
12 void Update()
13 {
14 this.move.sideway();
15 }
16}
あるいは別パターンとして、コードの基本的な形はそのままにして、Move
のMonoBehaviour継承をやめてPlayer_move
のtransform
を新規生成したMove
に何らかの手段で伝達する方法でも可能かと思います。
Move
のコンストラクタ引数を使って伝達する場合だと、こんな感じでしょうか。
C#
1using System.Collections;
2using System.Collections.Generic;
3using UnityEngine;
4
5class Move
6{
7 public float speed = 0.1f;
8
9 private Transform transform;
10
11 public Move(Transform transform)
12 {
13 this.transform = transform;
14 }
15
16 public void sideway()
17 {
18 if (Input.GetKey("d"))
19 {
20 transform.Translate(this.speed, 0, 0);
21 }
22 if (Input.GetKey("a"))
23 {
24 transform.Translate(-this.speed, 0, 0);
25 }
26 }
27}
28
29public class Player_move : MonoBehaviour
30{
31 // Use this for initialization
32 void Start()
33 {
34 }
35
36 // Update is called once per frame
37 void Update()
38 {
39 Move move = new Move(transform);
40 move.sideway();
41 }
42}
こちらもやはり、上記のように毎フレームMove
を生成するよりも、Start
内などで一度だけ生成する形の方が効率的かと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。