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

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

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

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

3回答

4025閲覧

Unity3D cubeの上に乗っているときだけジャンプできるようにしたい。

退会済みユーザー

退会済みユーザー

総合スコア0

Unity3D

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/04/07 13:18

イメージ説明
地面については当たり判定はtagを使ってコリジョンエンターでisGround = true にすることによって処理できているのですがブロックの上に乗っているときだけ isGround = true にしたいのですがどのような処理を書けばいいのでしょうか? 問題は"ブロックの上"という点なのですがコリジョンを使うとブロック全体になってしまうので困っています。教えてくれますでしょうか?

player.cs

1public class UnichanController: MonoBehaviour { 2 private Animator anim; 3 private Rigidbody rb; 4 private const float moveSpeed = 3.0f; 5 6 float inputHorizontal; 7 float inputVertical; 8 float speedx;//加速度x 9 float speedz;//加速度y 10 float speedy; 11 bool isJump = false;//ジャンプ判定 12 bool isGround = false;//地面判定 13 Vector3 vJumpForce = new Vector3(0,40.0f,0); 14 Vector3 vMove = new Vector3(); 15 Vector3 vj = new Vector3(0,0,0); 16 17 // Use this for initialization 18 void Start () 19 { 20 21 anim = GetComponent<Animator>(); 22 rb = GetComponent<Rigidbody>(); 23 } 24 25 void FixedUpdate() 26 { 27 // カメラの方向から、X-Z平面の単位ベクトルを取得 28 Vector3 cameraForward = Vector3.Scale(Camera.main.transform.forward, new Vector3(1, 0, 1)).normalized; 29 30 // 方向キーの入力値とカメラの向きから、移動方向を決定 31 Vector3 moveForward = (cameraForward * inputVertical) + (Camera.main.transform.right * inputHorizontal); 32 33 // 移動方向にスピードを掛ける。ジャンプや落下がある場合は、別途Y軸方向の速度ベクトルを足す。 34 //rb.velocity = (moveForward * moveSpeed) + new Vector3(0, rb.velocity.y, 0); 35 rb.velocity = (moveForward * moveSpeed) + new Vector3(0, rb.velocity.y, 0); 36 37 38 39 // キャラクターの向きを進行方向に 40 if (moveForward != Vector3.zero) 41 { 42 transform.rotation = Quaternion.LookRotation(moveForward); 43 } 44 45 46 // Key_Input(); 47 fjump(isJump,isGround); 48 // Debug.Log(rb.velocity.y); 49 Animation_Mng();//アニメ管理 50 speedy = Mathf.Abs(rb.velocity.y); 51 52 } 53 54 //ジャンプ処理管理 55 void fjump(bool jump,bool ground) 56 { 57 if(jump == true && ground == true) 58 { 59 Debug.Log("jump"); 60 rb.velocity += new Vector3(0,5.0f,0); 61 62 isGround = false; 63 isJump = false; 64 } 65 } 66 67 // Update is called once per frame 68 void Update () 69 { 70 71 Key_Input(); 72 } 73 74 //キー入力管理 75 void Key_Input() 76 { 77 if (Input.GetKey(KeyCode.Space) && isGround == true) 78 { 79 Debug.Log("key"); 80 isJump = true; 81 } 82 83 inputHorizontal = Input.GetAxisRaw("Horizontal"); 84 inputVertical = Input.GetAxisRaw("Vertical"); 85 } 86 87 88 //アニメーション管理クラス 89 void Animation_Mng() 90 { 91 92 if(inputHorizontal != 0) 93 { 94 anim.SetBool("Run",true); 95 96 97 } 98 99 if (inputVertical != 0) 100 { 101 anim.SetBool("Run", true); 102 103 } 104 105 if (inputHorizontal == 0 && inputVertical == 0) 106 { 107 anim.SetBool("Run", false); 108 109 } 110 111 //anim.speed = moveSpeed; 112 113 } 114 115 private void OnCollisionEnter(Collision c) 116 { 117 string name = c.gameObject.tag; 118 119 //地面判定 120 if("isGround" == name) 121 { 122 Debug.Log("地面"); 123 isGround = true; 124 125 rb.velocity = new Vector3(0,0,0); 126 127 } 128 } 129 130 void CheckGround() 131 { 132 133 } 134 135} 136

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

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

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

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

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

Alard

2019/04/22 18:26

Unityであなたが触れる言語はC#であってC++ではありません。 タグが間違っていますよ。
guest

回答3

0

CheckSphereとベクトルの合わせ技なんてどうでしょう。
ちょっと眠いので具体的なコードは今書けませんが、
CheckSphereで足元にブロックがあるか判定し、触れているオブジェクトの上面だったらtrue、なんて。
これなら後付けのオブジェクトにも対応できますしいいのではないでしょうか。

コードが欲しい場合はなにかご連絡をお願いします。

投稿2019/04/22 18:57

Alard

総合スコア21

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

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

0

プレイヤーの真下にRayを飛ばして、そこに足場があればOKみたいな考え方のやり方も可能です。

cs

1 // 現在の位置から下(0,-1,0)に向かってRayをセット 2 Ray ray = new Ray(transform.position,Vector3.down); 3 // Rayが当たった相手を保存する変数 4 RaycastHit hit; 5 6 // Rayを10.0fの距離まで発射。何かに当たればhitで受け取る 7 if(Physics.Raycast(ray, out hit, 10.0f)) { 8 9 // もし当たった相手のタグがstageなら足場の上にいるとする 10 if(hit.collider.tag == "stage") { 11 12 // 足場の上にいるから isGround 13 isGround = true; 14 } 15 } 16

投稿2019/04/08 00:42

hogefugapiyo

総合スコア3302

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

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

stdio

2019/04/08 01:36

それは...完全に空中でしか行えないやり方ですね...
guest

0

1.ブロックの壁に厚さ0.01ほどの細く透明なCubeを設置し、ブロックとプレイヤーが接触しないようにする

2.プレイヤーの足元に、プレイヤーのコリジョンより一回り小さい(プレイヤーと同じ大きさで作成してしまうと、横にも判定が入るため)コリジョンを作成し、そこで当たり判定をする

どちらも多少手間はかかりますが、自分が思いついたものはこれくらいでしょうか。。。

投稿2019/04/07 13:56

yuuyu

総合スコア1135

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問