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

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

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

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

Unity

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

Q&A

解決済

1回答

2558閲覧

Unity 2D用のベルトコンベアのギミックを作るには?(ランゲーム用)

Z_Silver

総合スコア27

C#

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

Unity

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

0グッド

1クリップ

投稿2019/07/14 13:57

編集2019/07/17 11:02

###前提・実現したいこと

以下のイメージ画像のような2D用のベルトコンベアを作成したいと考えております。
用途はランゲームです。(イメージ(例):マリオとかに出てくるベルトコンベア)

イメージ説明

まず最初にSurfaceEffector2Dを試してみましたが、動かないオブジェクト(アイテムや障害物)はベルトに乗せると
運べることを確認しましたが、自動で右に移動するキャラクターが乗ると反応がありませんでした。
(velocityで移動処理しているため?)

3Dのベルトコンベアを参考に調べていましたが、いまいちわからなかったので質問することにしました。
よろしくお願いします。

※自分が理解していないため、
ソースは参考サイトに載っているものをそのまま貼り付けた形になります。

キャラクターが乗ると停止し、ジャンプすると横にスライドする
思っているものと違う挙動になってしまいます。

###該当のソース

//ベルトコンベアのスピード [SerializeField] private float speed = 1f; private void OnCollisionStay2D(Collision2D col) { var body = col.gameObject.GetComponent<Rigidbody2D>(); if(body != null) { Vector3 add = transform.forward * speed * Time.deltaTime; body.MovePosition(col.transform.position + add); } } ``` ###キャラクターの移動処理

Rigidbody2D rd2D;
float moveSpeed;
float JumpPower = 450f;
const float SPEED = 6f;

void FixedUpdate()
{

switch (playerState)
{
---処理(省略)----
case PLAYER_STATE.MOVE://移動中
moveSpeed = SPEED;
break;
}

//キャラの移動
rd2D.velocity = new Vector2(moveSpeed, rd2D.velocity.y);

---処理(省略)----

//ジャンプ力分上に加速
if (isJumpFlg)
{
rd2D.AddForce(Vector2.up * JumpPower);
isJumpFlg = false;
}
}

###補足情報(言語/FW/ツール等のバージョンなど) Unity 2019.1.6f1 言語:C# 参考サイト:www.urablog.xyz/entry/2016/07/08/235728 キャラクターにはPhysics Material 2Dがついている状態です ↓↓↓↓改良後↓↓↓ ![イメージ説明](f883ba69f5f38da3b1a6b4cdd8ef4ad2.gif)

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

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

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

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

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

guest

回答1

0

ベストアンサー

提示されたコードですと、ベルトコンベアの作用がキャラの移動によって上書きされてしまっています。

ベルトコンベアの作用を受けるには Vector を足す必要があります。

C#

1Rigidbody2D rigidbody2D = GetComponent<Rigidbody2D>(); 2float moveSpeed = 0; 3// スペースキーが押されたときだけキャラが左へ走る 4if (Input.GetKey(KeyCode.Space)) 5{ 6 moveSpeed = -1f; 7} 8rigidbody2D.velocity = new Vector2(rigidbody2D.velocity.x + moveSpeed, rigidbody2D.velocity.y);

投稿2019/07/15 06:05

編集2019/07/15 22:00
nskydiving

総合スコア6500

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

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

Z_Silver

2019/07/15 15:13 編集

ご回答ありがとうございます。 処理を追加した所、ベルトコンベアに乗る前に キャラクターがものすごい勢いで右に移動してしまいました・・ これは、ベルトコンベア側の処理を変更したほうがいいのでしょうか? それとも、キャラクター側の処理を改良したほうがいいのでしょうか? また、キャラクターのソースを更新しました。
nskydiving

2019/07/15 22:03

どのくらいが適度なのかはゲーム内容によりけりですので、moveSpeed と SurfaceEffector2D のForce.Speed で調整してください。
Z_Silver

2019/07/17 08:06 編集

ベルトコンベアにつけたスクリプト処理をいったん止めて SurfaceEffector2Dも削除して 以下のように処理をプレイヤー側に //ベルトコンベアに乗った時 void OnCollisionStay2D(Collision2D col) { if (col.gameObject.tag == "beltconveyor") { Beltspeed = -5f; } } //ベルトコンベアから離れた時 void OnCollisionExit2D(Collision2D col) { if (col.gameObject.tag == "beltconveyor") { Beltspeed = 0; } } と追加して moveSpeedにBeltspeed を足すことで無事問題が解決しました。 また改良後の実行画像を追加しました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問