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

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

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

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

Unity

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

Q&A

解決済

2回答

2335閲覧

動く床の上のプレイヤーの動きの挙動について

BRAK

総合スコア98

C#

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

Unity

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

0グッド

0クリップ

投稿2020/08/06 13:04

編集2020/08/06 13:54

動く床の上に乗った時のプレイヤーの左右移動の挙動について
動く床をtransform.positionで三角関数を使って左右移動させ、その床の上にプレイヤーが乗った時に親を動く床にするというコードを作りました。
しかし、床と一緒に動くのはいいのですが、床の速度ベクトルがプレイヤーにも影響を及ぼしているらしく、

床に乗っていないときと動きの速度が遅いし挙動がおかしくなってしまいます。
ーー>誤字があるっぽいので変更点
動く床に乗っていないときと比べて動きの速度が遅いし挙動がおかしくなってしまいます。
(動く床に乗っていない時(通常の地面の上で)の歩く速さを2とすると、
動く床に乗っているときの歩く速さが0.5になる)

C# 床のコード

1コード 2[SerializeField] 3 private float moveSpeedX = 1f; 4 [SerializeField] 5 private float moveDistanceX = 1f; 6 [SerializeField] 7 private float moveSpeedY = 0f; 8 [SerializeField] 9 private float moveDistanceY = 0f; 10 private Vector2 initialPos;//初期位置 11 Rigidbody2D rb2D; 12 void Start() 13 { 14 //rb2D = GetComponent<Rigidbody2D>(); 15 initialPos = transform.localPosition; 16 } 17 18 19 void Update() 20 { 21 MoveFloor(); 22 } 23 24 void MoveFloor() 25 { 26 transform.localPosition = initialPos + new Vector2( 27 Mathf.Sin(moveSpeedX * Time.time) * moveDistanceX, 28 Mathf.Sin(moveSpeedY * Time.time) * moveDistanceY 29 ); 30 //rb2D.velocity = new Vector2( 31 // Mathf.Sin(moveSpeedX * Time.time) * moveDistanceX, 32 // Mathf.Sin(moveSpeedY * Time.time) * moveDistanceY 33 //); 34 }

C#

1コード 2プレイヤー側の処理 3 4 public void Run() 5 { 6 //左キー: -1、右キー: 1 7 change.x = Input.GetAxisRaw("Horizontal"); 8 9 //左か右を入力したら 10 //y軸操作時は左右に動けなくする 11 if (change.x != 0) 12 { 13 //入力方向へ移動 14 rb2d.velocity = new Vector2(change.x * speed, rb2d.velocity.y); 15 } 16 else 17 { 18 rb2d.velocity = new Vector2(0, rb2d.velocity.y); 19 } 20 } 21 22 private void OnCollisionStay2D(Collision2D col) 23 { 24 if (col.gameObject.CompareTag("MoveBox")) 25 { 26 transform.parent = col.transform; 27 } 28 } 29 30 private void OnCollisionExit2D(Collision2D col) 31 { 32 if (col.gameObject.CompareTag("MoveBox")) 33 { 34 transform.parent = null; 35 } 36 }

プレイヤーの移動はvelocityで制御しています。
また、床の方をrigidbodyで動かした際はなぜかプレイヤーが床の子なのにもかかわらず一緒に移動しませんでしたので、rigidbodyでの床移動はしていません。
どの点を変えればよいか教えてください。

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

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

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

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

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

guest

回答2

0

unity 動く床 でググるといいと思います。

【追記】

**MovingPlatform **

csharp

1using UnityEngine; 2 3public class MovingPlatform : MonoBehaviour 4{ 5 [SerializeField] float m_accel = 1f; 6 [SerializeField] float m_magnitude = 1f; 7 Vector2 m_initialPosition; 8 float m_timer; 9 10 void Start() 11 { 12 m_initialPosition = transform.localPosition; 13 } 14 15 void Update() 16 { 17 m_timer += Time.deltaTime; 18 transform.localPosition = m_initialPosition + Mathf.Cos(m_accel * m_timer) * m_magnitude * Vector2.right; 19 } 20 21 void OnCollisionEnter2D(Collision2D collision) 22 { 23 if (collision.gameObject.tag == "Player") 24 { 25 collision.transform.SetParent(this.transform); 26 } 27 } 28 29 void OnCollisionExit2D(Collision2D collision) 30 { 31 if (collision.gameObject.tag == "Player") 32 { 33 collision.transform.SetParent(null); 34 } 35 } 36} 37

PlayerWithMovingPlatform

csharp

1using UnityEngine; 2 3[RequireComponent(typeof(Rigidbody2D))] 4public class PlayerWithMovingPlatform : MonoBehaviour 5{ 6 [SerializeField] float m_speed = 1f; 7 Rigidbody2D m_rb = null; 8 9 void Start() 10 { 11 this.gameObject.tag = "Player"; 12 m_rb = GetComponent<Rigidbody2D>(); 13 } 14 15 void Update() 16 { 17 float h = Input.GetAxisRaw("Horizontal"); 18 Vector2 velocity = h * m_speed * Vector2.right; 19 velocity.y = m_rb.velocity.y; 20 m_rb.velocity = velocity; 21 } 22}

結果

イメージ説明

投稿2020/08/06 13:22

編集2020/08/06 14:57
bboydaisuke

総合スコア5308

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

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

BRAK

2020/08/06 13:24

10サイトくらい見たんですけど、なんかよいサイトありますか?
bboydaisuke

2020/08/06 13:26

> しかし、床と一緒に動くのはいいのですが、床の速度ベクトルがプレイヤーにも影響を及ぼしているらしく、床に乗っていないときと動きの速度が遅いし挙動がおかしくなってしまいます。 誤字があるため意味が不明瞭ですが、「床に乗っていない時にも床の動きの影響を受けてしまう」ということを言っているなら、床から降りた時に親子関係が解除できていないのでしょう。
bboydaisuke

2020/08/06 13:27

なお、質問の誤字についてはここにコメントを書いて済ますのではなく、質問の方の誤字を修正してください。
bboydaisuke

2020/08/06 13:32

> 床の速度ベクトルがプレイヤーにも影響を及ぼしているらしく コードを見た限りでは位置情報は直接変更している(瞬間移動を繰り返している)ため、重力とかで落ちていない限りは「速度ベクトル」はゼロのはずです。使っていないならば、ややこしいので「動く床」から Rigidbody2D は削除してしまった方がよいでしょう。
BRAK

2020/08/06 13:44

床に乗っていない時と動きの速度が遅いというのは、乗っていないときが本来の速度ということです。 あと、今は試作段階なので、rigidbody2Dは一応コードだけに載せているだけで、オブジェクトにはつけていないです。
BRAK

2020/08/06 13:49 編集

速度ベクトルが0ということは、実際、瞬間移動というのを繰り返しているからプレイヤーには影響がそもそもないということですか。 だとしたら、移動しているときに起こるプレイヤーの動きの鈍さがどこから来ているかが今回の問題ということで、サイト見ながらまた考察してみます。
BRAK

2020/08/07 06:50

わざわざ、ありがとうございます。 ただ、画面でもわかる通り床の進行方向と逆方向に移動すれば、移動速度が遅くなることがわかると思います。 このコードで試したところ、自分で作ったコードとほぼ同じ結果でした。 ちなみに私のコードだと、どっちの方向へ進もうと移動速度は遅くなります。
BRAK

2020/08/07 06:53

あと今サイト確認したのですが、私が解決できる記事ではないようです。
guest

0

自己解決

動く床に関して、恐らく、position移動には向いていないっぽいから、Rigidbodyで床を動かしてその速度をプレイヤーに代入してあげることが一番よさそうな気がする。

この方法でとりあえずは前のよりは思い描いていた挙動は実装できた。

尚、移動速度が遅くなることについては最低でもプレイヤーが設定した速度で移動はできる(床の移動速度をどんなにあげても割と大丈夫)ものの、
進行方向と同じ方向へ移動すると、速度を代入していることもあって、少し移動が速くなる点が今のところ欠点。
また、y軸については代入しなくても出来るみたいです。
代入すると跳ねます。

また、良い案を思いついたらここにまた記述します。

参考にしてください。

投稿2020/08/07 11:37

BRAK

総合スコア98

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

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

BRAK

2020/08/07 11:42

あと、子にはしていないです。 子にすると余計おかしくなります。 たとえば、指定したサイズに動くオブジェクトを設定した際にそのサイズが受動側に反映される点。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問