質問するログイン新規登録
C#

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

Q&A

解決済

2回答

1052閲覧

unity2D 某ゲームの太陽の動きを実装したい(プレイヤーに向かって敵が緩やかに追う動き)

mass02

総合スコア56

C#

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

0グッド

0クリップ

投稿2021/10/20 05:10

編集2021/10/26 10:41

0

0

いつも大変お世話になっています。
今回も質問失礼します。

タイトル通りの動きを実装したいのですが、現在自分が考えたコードだとプレイヤーに向かって直線的に追ってしまいます。
実装したい動きの動画
動画と違って画面は固定された状態です。

C#

1public class Sun : MonoBehaviour 2{ 3 4 public Rigidbody2D theRB; 5 //太陽が追ってくるスピード 6 public float moveSpeed; 7 //位置 8 private Vector3 moveDirection; 9  //時間設定 10 public static float time; 11  /太陽が戻る位置 12 public Transform point; 13 14 void Update() 15 { 16    //時間 17 time += Time.deltaTime; 18 } 19 20 21 22 void FixedUpdate() 23 { 24 25 //時間が1になったらプレイヤーを追いかける 26 if (time > 1f) 27 { 28 //プレイヤーを追う 29 moveDirection = Player.instance.transform.position - transform.position; 30 moveDirection.Normalize(); 31 theRB.velocity = moveDirection * moveSpeed; 32 33 } 34 //時間が5になったら太陽を元の位置に戻す 35 if (time > 5.0f) 36 { 37 38 moveDirection = point.transform.position - transform.position; 39 theRB.velocity = moveDirection; 40 41 } 42 43}

void FixedUpdate()内で何度も位置を更新してしまう為それを改善しました。
countで制御する

C#

1 void FixedUpdate() 2 { 3 //プレイヤーを追いかける 4 if(count == 0) 5 { 6 Invoke(nameof(SunP), 0.8f); 7 } 8 9 } 10 11 12 //太陽が画面の外に出たら戻る 13 private void OnBecameInvisible() 14 { 15 moveDirection = point.transform.position - transform.position; 16 theRB.velocity = moveDirection; 17 } 18 19//プレイヤーを追う 20 void SunP() 21 { 22 moveDirection = Player.instance.transform.position - transform.position; 23 moveDirection.Normalize(); 24 theRB.velocity = moveDirection * moveSpeed; 25 count = 1; 26 27 } 28 29 30 31//太陽がコライダーで指定した範囲に戻ったら慣性を0にして再度プレイヤーを追う 32 void OnTriggerEnter2D(Collider2D collision) 33 { 34 if (collision.gameObject.tag == "Sun") 35 { 36 theRB.velocity = Vector3.zero; 37 count = 0; 38 39 } 40 } 41 42 43 44

説明が足りない所があると思いますが、ご指摘頂ければありがたいです。
お時間が少し空いている方が居ましたら、お手隙で良いので助言よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

某太陽の動きに詳しくないのですが,示された動画をみる限りだと,
プレイヤーの方に向かう運動を開始した時点で移動経路が確定している
(質問文のコードを例にして言い換えれば,FixedUpdate() で毎回 Player.instance.transform.position を参照して都度移動具合を決める形ではない)
ようにも見えます.

よーいドンのタイミングで,
その時点でのプレイヤーの位置を通る放物線を算出して,あとはその放物線上を動いているだけ,みたいな.

投稿2021/10/20 05:42

fana

総合スコア12247

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

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

mass02

2021/10/22 01:16

ご回答ありがとうございます。 スタートのタイミングの時点で位置を取得してそこの位置に向かうにはFixedUpdate()では都度位置を取得してしまう為、Start()内で書く場合は1回しか呼ばれないのでそれも厳しいのでしょうか? それかFixedUpdate()でコルーチン等を使えばよろしいのでしょうか?
fana

2021/10/22 01:27

Unity に触れたことは無いので, 「Unity 的な意味(?)で」どこに どんな手段で 実装するのが{良い,一般的,etc}なのかは知りませんが, FixedUpdate() なる場所に書く場合でも,そこの記述で適切に条件分岐なりを入れてやればよいのではないでしょうか. if( 今からプレイヤーに向かう挙動を開始するなら ){ 放物線の計算とかする } else ( 放物線運動の途中であれば ){ 求めておいた放物線に沿う方向にちょっと動く } else { ... } とか何とか.
mass02

2021/10/22 12:59

ご回答ありがとうございます。 大変参考になります。 今一度教えて頂いた文で自分なりに考えてみます。
fana

2021/10/22 15:17

太陽が「うぉぉおお!俺は今からプレイヤーに向かう挙動を開始するぜ!!」という意思決定をした時点で, {その時点における太陽の位置,その時点におけるプレイヤーの位置}だけに基づいて放物線状の運動経路を決定するのであれば, 以降の N 回の FixedUpdate() では,前記決定済みの経路に沿う形で座標を更新するだけの話となる. (何なら,経路上のN点の座標を最初にあらかじめ算出してしまって,どこぞに覚えておけばいい)
mass02

2021/10/26 10:35

ご回答ありがとうございます。 とても分かりやすい内容で理解できました。 void FixedUpdate()内で何回も実行される(その度に位置を更新してしまう為) それを防ぐ方法が必要でした。 自分なりに解決したコードを質問欄に追加したいと思います。 本当にありがとうございました。
guest

0

現在の記述だとmoveDirectionが太陽とターゲットの差分となっているため、移動方向がプレーヤーの方向にまっすぐ向かうことになります。放物線のように動かしたいのであれば、太陽とターゲットのx座標の差分からmoveDirectionのy成分を調整する必要があります。

moveDirection = Player.instance.transform.position - transform.position; //ここでmoveDirectionのy成分を変更する moveDirection.Normalize(); theRB.velocity = moveDirection * moveSpeed;

太陽のx方向の移動速度が一定であれば、時間を変数としてy方向の速度・座標を調節してもよいと思います。

投稿2021/10/20 05:21

YOshim

総合スコア1094

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

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

mass02

2021/10/22 01:11

ご回答ありがとうございます。 時間を変数と言う事はまた別で変数を用意して、Time.deltaTime等を使用すると言う事でしょうか?
YOshim

2021/10/22 01:36

時間を変数とする場合はTime.deltaTimeを使用するのがよいと思います。
mass02

2021/10/22 12:56

ご回答ありがとうございます。とても参考になります。 大変失礼なお願いなのですが、y方向の速度・座標を調節の方法を少しでも良いのでコードの書き方のヒントを頂けないでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問