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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

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

Q&A

解決済

1回答

825閲覧

プレイヤーの方向を向いたまま壁沿いに反時計回りにキューブを動かしたいですが、うまく動きません。

enemyspotted

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

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

0グッド

0クリップ

投稿2021/11/15 14:16

編集2021/11/15 14:17

前提・実現したいこと

下のGIFのように敵と見立てたキューブを常にプレイヤーの方向を向いたまま壁に沿わせて反時計回りに回したいです。
イメージ説明
しかし、Playボタンを押してもキューブは動くことなく下のようなエラーコードを吐き、その場に静止してしまいます。

発生している問題・エラーメッセージ

NullReferenceException: Object reference not set to an instance of an object EnemyMove.Update () (at Assets/Scripts/EnemyMove.cs:50)

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class EnemyMove : MonoBehaviour 6{ 7 //ゲームオブジェクトの情報を取得する為の変数 8 GameObject player, wall, wall_1, wall_2, wall_3; 9 //レイが当たったオブジェクトの情報を取得する為の変数 10 RaycastHit hitXpositive, hitXnegative, hitZpositive, hitZnegative; 11 //Enemyの大きさ、Wallの大きさ、レイの長さ、間隔を調整する為の変数 12 float enemySize, wallSize, enemyRayLength, spaceAdjustment; 13 //Enemyの移動速度、半分の大きさにする為の係数 14 int enemyTopSpeed, enemySpeed, halfSize; 15 //レイの接触判定フラグ 16 bool rayXpositiveTouch, rayXnegativeTouch, rayZpositiveTouch, rayZnegativeTouch; 17 // Start is called before the first frame update 18 void Start() 19 { 20 //Playerタグのオブジェクトを取得 21 player = GameObject.FindGameObjectWithTag("Player"); 22 //Wallオブジェクトを取得 23 wall = GameObject.Find("Wall"); 24 wall_1 = GameObject.Find("Wall (1)"); 25 wall_2 = GameObject.Find("Wall (2)"); 26 wall_3 = GameObject.Find("Wall (3)"); 27 //EnemyオブジェクトのMeshRendererに含まれる矩形からx辺の長さを取得 28 enemySize = GetComponent<MeshRenderer>().bounds.size.x; 29 //WallオブジェクトのMeshRendererに含まれる矩形からy辺の長さを取得 30 wallSize = wall.GetComponent<MeshRenderer>().bounds.size.y; 31 //Enemyオブジェクト1辺分の長さ 32 enemyRayLength = enemySize; 33 //EnemyとWallとの間隔調整 34 spaceAdjustment = 1.5f; 35 //Enemyの移動速度 36 enemyTopSpeed = 5000; 37 enemySpeed = 3000; 38 //オブジェクトサイズの半分 39 halfSize = 2; 40 } 41 42 // Update is called once per frame 43 void Update() 44 { 45 //レイがどこにも接触していなかったら(ゲーム開始時点) 46 if (!rayXpositiveTouch && !rayXnegativeTouch && !rayZpositiveTouch && !rayZnegativeTouch) 47 { 48 //Wallの端からEnemy1.5個分(原点が基準なので、Enemy1.5個分で、壁から1個分空いているように見える)間隔を空けた位置に向けて移動。 49 //MoveTowardsを使う事でフレームやスピードの差異に関わらず指定位置に止める事ができる。 50cs:50→ transform.position = Vector3.MoveTowards(transform.position, new Vector3(wall_2.transform.position.x, wall_2.transform.position.y, wall_2.transform.position.z - enemySize * spaceAdjustment), Time.deltaTime * enemyTopSpeed); 51 } 52 //正のX方向のレイが接触していたら 53 if (rayXpositiveTouch) 54 { 55 //Wallの原点に正のZ方向へWall半分プラスした位置 = Wallの端 56 transform.position = Vector3.MoveTowards(transform.position, new Vector3(transform.position.x, transform.position.y, wall_3.transform.position.z + wallSize / halfSize - enemySize * spaceAdjustment), Time.deltaTime * enemySpeed); 57 } 58 //正のZ方向のレイが接触していたら 59 if (rayZpositiveTouch) 60 { 61 //Wallの原点に負のX方向へWall半分マイナスした位置 = Wallの端 62 transform.position = Vector3.MoveTowards(transform.position, new Vector3(wall_2.transform.position.x - wallSize / halfSize + enemySize * spaceAdjustment, transform.position.y, transform.position.z), Time.deltaTime * enemySpeed); 63 } 64 //負のX方向のレイが接触していたら 65 if (rayXnegativeTouch) 66 { 67 //Wallの原点に負のZ方向へWall半分マイナスした位置 = Wallの端 68 transform.position = Vector3.MoveTowards(transform.position, new Vector3(transform.position.x, transform.position.y, wall_1.transform.position.z - wallSize / halfSize + enemySize * spaceAdjustment), Time.deltaTime * enemySpeed); 69 } 70 //負のZ方向のレイが接触していたら 71 if (rayZnegativeTouch) 72 { 73 //Wallの原点に正のX方向へWall半分マイナスした位置 = Wallの端 74 transform.position = Vector3.MoveTowards(transform.position, new Vector3(wall.transform.position.x + wallSize / halfSize - enemySize * spaceAdjustment, transform.position.y, transform.position.z), Time.deltaTime * enemySpeed); 75 } 76 //Enemyの原点に半径分プラスした位置からX方向とZ方向にレイを飛ばす 77 Ray rayXpositive = new Ray(transform.position + new Vector3(enemySize / halfSize, 0, 0), Vector3.right); 78 Ray rayXnegative = new Ray(transform.position + new Vector3(-enemySize / halfSize, 0, 0), Vector3.left); 79 Ray rayZpositive = new Ray(transform.position + new Vector3(0, 0, enemySize / halfSize), Vector3.forward); 80 Ray rayZnegative = new Ray(transform.position + new Vector3(0, 0, -enemySize / halfSize), Vector3.back); 81 //rayの可視化 82 Debug.DrawRay(rayXpositive.origin, rayXpositive.direction * enemyRayLength, Color.magenta); 83 Debug.DrawRay(rayXnegative.origin, rayXnegative.direction * enemyRayLength, Color.magenta); 84 Debug.DrawRay(rayZpositive.origin, rayZpositive.direction * enemyRayLength, Color.cyan); 85 Debug.DrawRay(rayZnegative.origin, rayZnegative.direction * enemyRayLength, Color.cyan); 86 //正のX方向のレイが壁に接触していたら、フラグON 87 if (Physics.Raycast(rayXpositive, out hitXpositive, enemyRayLength)) 88 { 89 rayXpositiveTouch = true; 90 } 91 //正のX方向のレイが壁に接触していなかったら、フラグOFF 92 else if (!Physics.Raycast(rayXpositive, out hitXpositive, enemyRayLength)) 93 { 94 rayXpositiveTouch = false; 95 } 96 //負のX方向のレイが壁に接触していたら、フラグON 97 if (Physics.Raycast(rayXnegative, out hitXnegative, enemyRayLength)) 98 { 99 rayXnegativeTouch = true; 100 } 101 //負のX方向のレイが壁に接触していなかったら、フラグOFF 102 else if (!Physics.Raycast(rayXnegative, out hitXnegative, enemyRayLength)) 103 { 104 rayXnegativeTouch = false; 105 } 106 //正のZ方向のレイが壁に接触していたら、フラグON 107 if (Physics.Raycast(rayZpositive, out hitZpositive, enemyRayLength)) 108 { 109 rayZpositiveTouch = true; 110 } 111 //正のZ方向のレイが壁に接触していなかったら、フラグOFF 112 else if (!Physics.Raycast(rayZpositive, out hitZpositive, enemyRayLength)) 113 { 114 rayZpositiveTouch = false; 115 } 116 //負のZ方向のレイが壁に接触していたら、フラグON 117 if (Physics.Raycast(rayZnegative, out hitZnegative, enemyRayLength)) 118 { 119 rayZnegativeTouch = true; 120 } 121 //負のZ方向のレイが壁に接触していなかったら、フラグOFF 122 else if (!Physics.Raycast(rayZnegative, out hitZnegative, enemyRayLength)) 123 { 124 rayZnegativeTouch = false; 125 } 126 //常にPlayerの方を向く 127 transform.LookAt(player.transform); 128 } 129}

試したこと

補足情報(FW/ツールのバージョンなど)

Unity 2020.3.14

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

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

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

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

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

guest

回答1

0

自己解決

壁の名前を「wall」から「Wall」にしたら、うまく動きました。

投稿2021/11/16 00:50

enemyspotted

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問