前提・実現したいこと
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です。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/04/28 08:52