🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

Unity

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

Q&A

解決済

2回答

1093閲覧

2Dシューティングゲーム弾をそのまま進めたい

Halhalhal

総合スコア11

C#

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

Unity

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

0グッド

1クリップ

投稿2019/11/25 00:47

編集2019/11/25 00:48

前提・実現したいこと

unityで2Dシューティングゲームを作っています.
敵が弾を打った時に、自分がいた場所に飛んでくるようにしたのですがそこで止まってしまいます。
その弾をその線上で進み続けるようにしたいです。

■■な機能を実装中に以下のエラーメッセージが発生しました。

敵が弾を打った時に、自分がいた場所に飛んでくるようにしたのですが弾が自分のいた場所で止まってしまいます。

該当のソースコード

c#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Enemybullet : MonoBehaviour 6{ 7 GameObject Player; 8 GameObject Enemy; 9 10 public float speed = 3.0f; // 移動スピード] 11 12 public Vector3 PlayerPos { get; private set; } 13 14 // Start is called before the first frame update 15 void Start() 16 { 17 // playerオブジェクトを取得 18 this.Player = GameObject.Find("Player"); 19 this.Enemy = GameObject.Find("Enemy"); 20 21 Destroy(gameObject, 3.0f); 22 //Vector3 PlayerPos = this.Player.transform.position; 23 PlayerPos = this.Player.transform.position; 24 25 } 26 27 // Update is called once per frame 28 void Update() 29 { 30 31 // float step = speed * Time.deltaTime; 32 //Enemybullet.transform.position = Vector3.MoveTowards(Enemybullet.transform.position, Player.transform.position,step); 33 34 float ENEMY_MOVE_SPEED = 0.05f; 35 36 // プレイヤーの方向に移動させる 37 transform.position = Vector3.MoveTowards(transform.position, PlayerPos, ENEMY_MOVE_SPEED); 38 39 } 40} 41 42 43 44### 試したこと 45 46Movetowardsだとその場所にいくコードだと思うのですが、代わりに何か使うのでしょうか? 47 48### 補足情報(FW/ツールのバージョンなど) 49unity2019.2.19

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

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

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

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

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

sakura_hana

2019/11/25 01:58

ぱっと見このコードでも動くように思います。 ・エラーは出ていませんか? ・Startの最終行に Debug.Log(PlayerPos); とやるとPlayerPosがコンソールに表示されます。 そこの値は正しいですか?(transform.positionと合致していませんか?)
sakura_hana

2019/11/25 02:26

質問は「弾を撃った時に弾がプレイヤーのいた場所まで移動後、プレイヤーのいた位置で止まってしまう(その先に移動しない)」という意味ですかね? もしそうなら既に付いている回答を参照してください。 上記は「弾の生成位置で止まる(動かない)」と読んでしまった為のものですので、そうでないならばスルー頂いて構いません。 (出来れば「そこで」とか「自分」とか抽象的な表現はやめて頂けると助かります)
Halhalhal

2019/11/25 02:55

自分の伝え方が抽象的過ぎました... ご指摘ありがとうございます。
guest

回答2

0

私もUnity初心者なので、詳しい人が来るまでとりあえず場をつなぎますが。。。

Start()では「プレイヤーへの向き(単位ベクトル)」を算出しておき、それをメンバー変数へ保持、
Update()では(↑で作ったベクトル * Speed * Time.deltaTime)分、transform.Translateすれば良いのかなとは思いました。

投稿2019/11/25 01:47

takabosoft

総合スコア8356

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

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

Halhalhal

2019/11/25 02:55

参考にして組んでみます! ありがとうございます。
guest

0

ベストアンサー

MoveTowardsはその地点にいく、ですから通り過ぎることはありません

等速直線弾はこんな感じになると思います

Vector3 move; void Update(){ transform.position = transform.position + move * Time.deltaTime; } // 使い方はこんな感じ // Aim(enmey.transform.positon, player.transform.position, 3.0f); void Aim(Vector3 positon, Vector3 target, float speed){ move = (target - position).normalized * speed; }

STGだとEnemyは1体だけではないですし、常にPlayerしか狙わない弾というのは単調なので、
これらの値は内部で取得しないほうがいいと思います

投稿2019/11/25 02:09

izmktr

総合スコア2856

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

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

Halhalhal

2019/11/25 02:53

using System.Collections; using System.Collections.Generic; using UnityEngine; public class Enemybullet : MonoBehaviour { GameObject Player; GameObject Enemy; public float speed = 3.0f; // 移動スピード] public Vector3 PlayerPos { get; private set; } public Vector3 EnemyPos { get; private set; } public Vector3 move; // Start is called before the first frame update void Start() { this.Player = GameObject.Find("Player"); this.Enemy = GameObject.Find("Enemy2"); PlayerPos = this.Player.transform.position; EnemyPos = this.Enemy.transform.position; } void Update() { transform.position = transform.position + move * Time.deltaTime; } void Aim(Vector3 EnemyPos, Vector3 PlayerPos, float speed) { move = (PlayerPos - EnemyPos).normalized * speed; } } 実際にこのようなコードを作ったのですが、弾を生成した場所で止まってしまいました。 どこかコードのミス部分などがああるようでしたらご指摘お願いします。
izmktr

2019/11/25 03:04

Aim関数は呼び出していますか?
Halhalhal

2019/11/26 00:35

Aim関数を呼び出すコードを書いたら動きました! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問