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

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

新規登録して質問してみよう
ただいま回答率
85.49%
Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Q&A

解決済

2回答

7838閲覧

untiy terrain機能で作った壁が登れてしまう

sminier

総合スコア25

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

1グッド

4クリップ

投稿2016/10/25 11:00

unityで、terrainで作った壁を登れなくしたいです。
キャラクターがジャンプ中に移動方向に進むと、terrainで作った急斜面な山や壁を登れてしまいます。

滑り落ちるのが理想です。
PhysicMaterialで摩擦を0にしてもダメでした。cubeなどで作った壁は滑り落ちるのですが、terrainは若干斜めになっているのか、キャラクターをジャンプ中に移動させるとterrainに沿って徐々に上に上がっていってしまいます。

terrainで作ったオブジェクト登らせず滑り落とす方法はありますか?

Koopa👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

C#

1using UnityEngine; 2using System.Collections; 3 4public class PlayerScript : MonoBehaviour { 5 6 private float h; 7 private float v; 8 9 private float speed; 10 private float jumpspeed = 30f; 11 12 private CharacterController cc; 13 private Vector3 dir; 14 15 //以下Raycast関連変数 16 int layerMask = 1 << LayerMask.NameToLayer("Ground"); 17 bool isSliding; 18 19 RaycastHit slideHit; 20 21 float gravity = 40.8f; 22 float slideSpeed=30.0f; 23 24 // Use this for initialization 25 void Start () { 26 h = 0; 27 v = 0; 28 speed = 20; 29 dir = Vector3.zero; 30 cc = gameObject.GetComponent<CharacterController> (); 31 Physics.gravity = new Vector3(0, 20.81f, 0); 32 } 33 34 // Update is called once per frame 35 void Update () { 36 37 h = Input.GetAxis ("Horizontal") * speed; 38 v = Input.GetAxis ("Vertical") * speed; 39 40 if (Physics.Raycast (transform.position, Vector3.down, out slideHit)) { 41 Debug.Log ("Ray出てます!!!"); 42 //衝突した際の面の角度とが滑らせたい角度以上かどうかを調べます。 43 if (Vector3.Angle (slideHit.normal, Vector3.up) > cc.slopeLimit) { 44 Debug.Log ("slopeLimitを超えました" + cc.slopeLimit); 45 isSliding = true; 46 } else { 47 Debug.Log ("slopeLimit以下になりました" + cc.slopeLimit); 48 isSliding = false; 49 } 50 } 51 52 53 if (cc.isGrounded) 54 { 55 dir = new Vector3(h,0,v); 56 dir = transform.TransformDirection(dir); //ジャンプ軌道 57 58 // dir *= speed; 59 60 if (Input.GetKeyDown(KeyCode.Space)) 61 { 62 Debug.Log("ジャンプしました"); 63 dir.y = jumpspeed; 64 } 65 if (isSliding) 66 {//滑るフラグが立ってたら 67 Debug.Log("滑る処理です"); 68 Vector3 hitNormal = slideHit.normal; 69 dir.x = hitNormal.x; 70 dir.y = gravity * Time.deltaTime;//重力落下 71 dir.z = hitNormal.z; 72 } 73 } 74 75 76 77 dir.y -= 50f * Time.deltaTime; 78 79 80 cc.Move (dir * Time.deltaTime); 81 82 83 84 //Debug.Log ("" + h + "," + v +","+ jumpspeed); 85 } 86 87 void OnCollisionEnter(Collision col) 88 { 89 Debug.Log("Hit!"); 90 if (col.gameObject.CompareTag("Target")) { 91 Destroy(col.gameObject); 92 } 93 } 94} 95

参考になれば幸いです。

投稿2016/10/27 09:54

ponokaPG

総合スコア48

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

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

0

自分も今同じことをやっています。Raycastで壁を登らせたくないオブジェクトからRayを出して地形判定に
ヒットしたら分岐で角度でスライドさせる処理に飛ばすみたいなことをやっています。成功はまだしてません。

投稿2016/10/26 12:55

ponokaPG

総合スコア48

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

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

ponokaPG

2016/10/27 06:47

解決しましたので帰ったら詳しい内容書きます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問