壁に向かってジャンプして、触れると落下せずにストップできる仕組みをつくってみましょう。
クリックした方向に向かってCubeがジャンプ。
壁のオブジェクトにぶつかると、落ちていかずに、その場所にくっつくようにします。
関連記事:
クリックした方向へジャンプする
左右にRaycastの接触判定をつくる
Raycastによる接地判定
着地していればジャンプ可能
傾斜を上っていくPrefab
壁オブジェクトに触れるとくっつく
平面とCubeを作成します。
CubeのY座標を0.5にして、リジッドボディを追加します。
Cubeにわかりやすい色をつけます。
シーンビューではこのように配置されています。
Cubeがひっくり返らないように、回転を固定します。
リジッドボディのConstraintsを展開し、回転を固定にチェックを入れます。
もう一つCubeを作成し、名前をWallに変更。
座標とサイズを変更し、壁オブジェクトを作ります。
CubeJump.csを作成し、Cubeに追加しましょう。
CubeJump.csを記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class CubeJump : MonoBehaviour { private Rigidbody rb; private int upForce; private Vector3 mousePosition; private Vector3 objPosition; private float rayDistance; void Start() { rb = GetComponent<Rigidbody>(); upForce = 300; rayDistance = 0.5f; rb.isKinematic = false; } void Update() { Vector3 rayPosition = transform.position + new Vector3(0.0f, 0.0f, 0.0f); Ray ray1 = new Ray(rayPosition, Vector3.right); Debug.DrawRay(rayPosition, Vector3.right * rayDistance, Color.red); RaycastHit hit; if(Physics.Raycast(ray1, out hit, rayDistance)) { if (hit.collider.name == "Wall") { rb.isKinematic = true; } } if(Input.GetMouseButtonDown(0)) { rb.isKinematic = false; mousePosition = Input.mousePosition; mousePosition.z = 10.0f; objPosition = Camera.main.ScreenToWorldPoint(mousePosition); rb.AddForce(new Vector3(objPosition.x*20, upForce, 0)); } } } |
ゲームプレイしましょう。
クリックでジャンプして、壁にぶつかれば、その場でストップ。
逆方向に向けてクリックすれば、壁から離れてジャンプします。
Cubeの中心から、RayCastを右方向に向けて0.5出しています。
RayCastに触れると、リジッドボディのisKinematicがTrueに。
クリックすると、isKinematicがfalseとなって、再びジャンプ可能になります。
関連記事:
クリックした方向へジャンプする
左右にRaycastの接触判定をつくる
Raycastによる接地判定
着地していればジャンプ可能
傾斜を上っていくPrefab