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

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

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

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

Unity

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

Q&A

0回答

575閲覧

指定した座標にレーザーを撃ち込みたい

Unimeshi

総合スコア1

C#

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

Unity

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

0グッド

0クリップ

投稿2020/08/31 13:14

編集2020/09/02 05:27

現在2Dシューティングゲームを制作しています。
『数秒ほどプレイヤーを追跡し、一定時間後、座標を固定して、そこにレーザーを撃ち込む』というスクリプトを作りたいのですが、どうしてもProject上の座標(0, 0, 0)にレーザーが飛んで行ってしまいます。
###実現したいこと

#####【プレイヤーObjectを追跡用オブジェクトが追跡=> 一定時間後、追跡用オブジェクトの座標を固定=>追跡用オブジェクトの座標にレーザーを撃ち込む】

流れとしては、【プレイヤーObjectを追跡用オブジェクトが追跡=> 一定時間後、追跡用オブジェクトの座標を固定=>追跡用オブジェクトの座標にレーザーを撃ち込む】といった流れです。

5時間くらい奮闘したのですが、一向に解決しなかったので質問させていただきました。
###追跡用オブジェクト

C#

1using System.Collections; 2using System.Collections.Generic; 3 4using UnityEngine; 5 6public class Rader : MonoBehaviour 7{ 8 public GameObject Player; 9 public float Speed = 12f; 10 11 bool Stop = false; 12 13 14 void Start() 15 { 16 Player = GameObject.Find("Player"); 17 18 } 19 20 void Update() 21 { 22 23 if (Stop == false) 24 { 25 26 if (Player != null) 27 { 28 LockStart(); 29 Invoke("LockOn", 4f); 30 } 31 } 32 } 33 34 void LockStart() 35 { 36 this.transform.position = Vector3.MoveTowards( 37 this.transform.position, 38 new Vector3(Player.transform.position.x, 39 Player.transform.position.y), 40 Speed * Time.deltaTime 41 ); //追尾関係 42 } 43 44 void LockOn() 45 { 46 Stop = true; 47 } 48}

###レーザー砲

C#

1using System.Collections; 2using System.Collections.Generic; 3using System.Collections.Specialized; 4using System.Net; 5using System.Net.Mime; 6using System.Security.Cryptography; 7using System.Threading; 8using UnityEngine; 9 10public class Lazer : MonoBehaviour 11{ 12 float speed = 10.0f; 13 int count = 0; 14 15 public Transform TargetObj; 16 17 void Update() 18 { 19 var diff = (TargetObj.position - transform.position).normalized; 20 transform.rotation = Quaternion.FromToRotation(Vector3.up, diff); 21 count++; 22 23 if (count >= 300) 24 { 25 this.transform.localScale -= new Vector3(speed * Time.deltaTime, speed * Time.deltaTime, 0); //段々消えていく。 26 if (transform.localScale.y < 0) 27 { 28 Destroy(gameObject); 29 } 30 } 31 32 } 33}

###ボス(raderおよびlazer呼び出す側のスクリプト)
######必要ないと思われるところは省略しました

C#

1using System; 2using System.Collections; 3using System.Collections.Generic; 4using System.ComponentModel.Design; 5using System.Net; 6using System.Security.Cryptography; 7using System.Security.Permissions; 8using System.Threading; 9using UnityEngine; 10 11public class boss : MonoBehaviour 12 13 public Transform firePoint6; 14 public Transform raderPoint; 15 16 public GameObject rader; 17 public GameObject lazer; 18void lockOn() 19 { 20 //ーーーーーーーーーーーーーーーーーーレーザー関連ーーーーーーーーーーーーーーーーーーーーーー// 21 Instantiate(rader, raderPoint.position, rader.transform.rotation); 22 Invoke("LaserBeam", 4f); 23 } 24 25 void LaserBeam() 26 { 27 Instantiate(lazer, firePoint6.position, lazer.transform.rotation); 28 } 29 30 31 32 private void OnTriggerEnter2D(Collider2D collision) 33 { 34 //collisionにぶつかった相手の情報が入っている:bullet,player 35 if (collision.CompareTag("Player") == true) 36 { 37 gameController.GameOver(); 38 } 39 else if (collision.CompareTag("Bullet") == true) 40 { 41 int tmpPoint = BossLife; 42 tmpPoint = tmpPoint - 1; 43 BossLife = tmpPoint; 44 45 if (BossLife == 100) 46 { 47 InvokeRepeating("lockOn", 1f, 20f); 48 49 if (BossLife == 0) 50 { 51 Instantiate(explosion, transform.position, transform.rotation); 52 Destroy(gameObject); 53 Destroy(collision.gameObject); 54 gameController.AddScore(); 55 } 56 } 57 } 58 } 59}

なんとかして座標を取得できないのでしょうか。それとも、そもそもPrefabの座標は更新できないのでしょうか?

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

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

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

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

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

shiena

2020/09/01 17:08

LazerのTargetObjに値を代入する部分のコードを追記してください。何を追跡しているのか分かりません。
Unimeshi

2020/09/02 03:38 編集

えっと、つまりTargetObjの座標を取得するコードを書くということでしょうか。 『public Transform TargetObj』にオブジェクトを入れるだけではだめなのでしょうか? 無知で申し訳ありません・・・。
shiena

2020/09/02 03:48

はい、それで良いのですがTargetObjに入れるオブジェクトを間違っていたり他が原因の可能性もあるのでPrefabをInstantiateする辺りから追記してほしいのです。
Unimeshi

2020/09/02 04:13

追記しました。関係ないと思うところは省略しました。
shiena

2020/09/02 04:37

追記ありがとうございます。TargetObjを入れる部分も省略されているのでしょうか?LazerのUpdateでNullPointerReferenceが出そうです。
Unimeshi

2020/09/02 05:44 編集

すみません、単純に入れ忘れていました…。 TargetObjとなる「追跡用オブジェクト」はLazerの「public Transform TargetObj」にも入れるため、NullPoは今のところ起きていません。
Unimeshi

2020/09/02 05:44

実はこのTargetObjにいれるオブジェクト(追跡用オブジェクト)なのですが、Projectからコンポーネントしているため、恐らくProject内の座標を参照しているんだと思っています。TargetObjに入っているオブジェクト(追跡用オブジェクト)の、停止時の座標の取得は成功しているため、あとはその座標を参照するように書けば解決すると思っているのですが・・・。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問