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

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

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

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

Unity

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

Q&A

解決済

1回答

4226閲覧

Unity2Dゲームでブロックを持ち上げて運びたい

iota

総合スコア2

C#

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

Unity

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

0グッド

1クリップ

投稿2021/04/28 07:05

前提・実現したいこと

Unity初心者です。

マリオのような2Dアクションゲームで、[目の前にあるRigidbody2Dを付与したオブジェクトを頭上に持ち上げて運ぶ]という要素を入れたいです。

発生している問題

目の前のオブジェクトを頭上に持ち上げて横に移動することはできたのですが、ジャンプをしようとすると持ち上げた頭上のブロックに頭をぶつけるかのような挙動をして、うまく跳んでくれません。持っているオブジェクトの物理判定は残したいです。

該当のソースコード

大変拙いコードで申し訳ないです

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class PlayerCtr : MonoBehaviour 6{ 7 //運動性能 8 public float speed = 10; 9 public float jumpForce = 200; 10 11  //持つオブジェクト 12 public GameObject BringObject = null; 13 14  //着地判定のスクリプト 15 IsTriggerGround isGround; 16 17 //デバッグ用 18 [SerializeField] UnityEngine.UI.Text label; 19 20 //動かすときの変数 21 bool Grounded = false; // 地面に着地しているか判定する変数 22 float xSpeed = 0.0f; 23 bool directionRight = true; 24 25 //オブジェクト参照用変数 26 GameObject oHold = null; 27 28 public enum STATE{ 29 STAY, 30 WALK, 31 JUMP, 32 FALL, 33 HOLDSTAY, 34 HOLDWALK, 35 } 36 37 STATE state = STATE.STAY; 38 39//中略 コンポーネントの取得とボタン操作のことしか書いてないので… 40 41 void FixedUpdate() 42 { 43 rb.velocity = new Vector2(xSpeed, rb.velocity.y); 44 45 //ステージを持ってた時に一緒に動く 46 if (BringObject != null) 47 { 48 BringObject.transform.position = new Vector3(this.transform.position.x, this.transform.position.y + 1.1f, this.transform.position.z); 49 } 50 } 51 52 53 //歩行処理 54 void Walk() 55 { 56 57 //横移動 58 xSpeed = Input.GetAxis("Horizontal") * speed; 59 if (xSpeed < 0) 60 { 61 state = STATE.WALK; 62 63 directionRight = false; 64 } 65 else if (xSpeed > 0) 66 { 67 state = STATE.WALK; 68 69 directionRight = true; 70 } 71 //向き変更 72 SpRender.flipX = !directionRight; 73 if (Input.GetKeyUp(KeyCode.A) || Input.GetKeyUp(KeyCode.D)) 74 { 75 rb.velocity = new Vector2(0, rb.velocity.y); 76 } 77 } 78 79 //ジャンプ処理 80 void Jump() 81 { 82 if (Input.GetButtonDown("Jump") && isGround.IsGround()) 83 { 84 state = STATE.JUMP; 85 86 rb.AddForce(Vector2.up * jumpForce); 87 } 88 } 89 90 //オブジェクトを持つ処理 91 void HoldBlock() 92 { 93 if (BringObject == null) 94 { 95 int layerMask = 1 << 8; 96 RaycastHit2D hit; 97 if (directionRight) 98 hit = RaycastAndDraw(new Vector2(0 + transform.position.x, 0 + transform.position.y), transform.right, 1.0f, layerMask); 99 else 100 hit = RaycastAndDraw(new Vector2(0 + transform.position.x, 0 + transform.position.y), transform.right, -1.0f, layerMask); 101 102 //ブロックが見つかったら持つ 103 if (hit.collider.name == "CarryObject") 104 { 105 if (BringObject == null) 106 { 107 BringObject = hit.collider.gameObject; 108 BringObject.GetComponent<Rigidbody2D>().isKinematic = true; 109 BringObject.GetComponent<Rigidbody2D>().mass = 0; 110 111 112 BringObject.transform.parent = this.transform; 113 114 } 115 } 116 } 117 else//おろすときの処理 118 { 119 120 } 121 } 122 123 /// <summary> 124 /// Rayを飛ばすと同時に画面に線を描画する 125 /// </summary> 126 public static RaycastHit2D RaycastAndDraw(Vector2 origin, Vector2 direction, float maxDistance, int layerMask) 127 { 128 RaycastHit2D hit = Physics2D.Raycast(origin, direction, maxDistance, layerMask); 129 130 //衝突時のRayを画面に表示 131 if (hit.collider) 132 { 133 Debug.DrawRay(origin, hit.point - origin, Color.blue, 0.1f, false); 134 } 135 //非衝突時のRayを画面に表示 136 else 137 { 138 Debug.DrawRay(origin, direction * maxDistance, Color.green, 0.1f, false); 139 } 140 141 return hit; 142 } 143} 144

試したこと

Rigidbodyの精度をいじったりしましたが、何も進展しませんでした。
ジャンプ力をめちゃめちゃに上げても挙動は変わりませんでした。

よろしくお願いします。m(_ _)m

補足情報(FW/ツールのバージョンなど)

バージョンは2019.4.2f1です。

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

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

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

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

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

guest

回答1

0

ベストアンサー

すぐ思いついたのは
レイヤーの調整が可能な場合は手に持っている間、そのオブジェクトとプレイヤーを同じレイヤーで管理して、なおかつ同レイヤー間での当たり判定を切ることです。

プレイヤーは持ち上げているブロックとはぶつからないことになるので、ジャンプできるようになるという感じです。

https://kan-kikuchi.hatenablog.com/entry/ChangeLayer

もしくはプレイヤーの子オブジェクトにしてしまうのでも動くかなと思いました。
たぶん今ってプレイヤーの動きとブロックの位置同期が別々に行われているせいで、プレイヤージャンプ→でもブロックあるから止まる→ブロック位置同期みたいな感じなのかなって。

投稿2021/04/28 07:48

hogefugapiyo

総合スコア3302

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

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

iota

2021/04/28 08:52

レイヤーを管理する方法でうまくいきました!!! 迅速な回答ありがとうございます!!!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問