画像の紫のブロックの上に乗っているときもジャンプできるようにしたいのですがどすればいいのでしょうか?
Rayを飛ばすました、またDebug.logでisGroundなどの変数をのtrue falseを出力してみましたがわかりません教えてくれますでしょうか?
※ちなみに地面とブロックにはtag: isGroundを設定しています。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class UnichanController: MonoBehaviour { private Animator anim; private Rigidbody rb; private const float moveSpeed = 3.0f; float inputHorizontal; float inputVertical; float speedx;//加速度x float speedz;//加速度y float speedy; bool isJump = false;//ジャンプ判定 bool isGround = false;//地面判定 RaycastHit hit; // Use this for initialization void Start () { anim = GetComponent<Animator>(); rb = GetComponent<Rigidbody>(); } void FixedUpdate() { // カメラの方向から、X-Z平面の単位ベクトルを取得 Vector3 cameraForward = Vector3.Scale(Camera.main.transform.forward, new Vector3(1, 0, 1)).normalized; // 方向キーの入力値とカメラの向きから、移動方向を決定 Vector3 moveForward = (cameraForward * inputVertical) + (Camera.main.transform.right * inputHorizontal); // 移動方向にスピードを掛ける。ジャンプや落下がある場合は、別途Y軸方向の速度ベクトルを足す。 //rb.velocity = (moveForward * moveSpeed) + new Vector3(0, rb.velocity.y, 0); rb.velocity = (moveForward * moveSpeed) + new Vector3(0, rb.velocity.y, 0); // キャラクターの向きを進行方向に if (moveForward != Vector3.zero) { transform.rotation = Quaternion.LookRotation(moveForward); } // Key_Input(); // Debug.Log(rb.velocity.y); Animation_Mng();//アニメ管理 speedy = Mathf.Abs(rb.velocity.y); } //ジャンプ処理管理 void fjump(bool jump,bool ground) { if(jump == true && ground == true) { Debug.Log("jump"); rb.velocity += new Vector3(0,2.0f,0); isGround = false; isJump = false; } } // Update is called once per frame void Update () { ray(); Key_Input(); fjump(isJump, isGround); Debug.Log(isGround); } void ray()//地面判定処理 { Ray ray = new Ray(transform.position, Vector3.down); if (Physics.Raycast(ray,out hit,8.0f)) { if(hit.collider.tag == "isGround") { Debug.Log("ray"); isGround = true; } } } //キー入力管理 void Key_Input() { if (Input.GetKey(KeyCode.Space) && isGround == true) { //Debug.Log("key"); isJump = true; } inputHorizontal = Input.GetAxisRaw("Horizontal"); inputVertical = Input.GetAxisRaw("Vertical"); } //アニメーション管理クラス void Animation_Mng() { if(inputHorizontal != 0) { anim.SetBool("Run",true); } if (inputVertical != 0) { anim.SetBool("Run", true); } if (inputHorizontal == 0 && inputVertical == 0) { anim.SetBool("Run", false); } //anim.speed = moveSpeed; } private void OnCollisionEnter(Collision c) { string name = c.gameObject.tag; //地面判定 if("isGround" == name) { // Debug.Log("地面"); //isGround = true; rb.velocity = new Vector3(0,0,0); } } void CheckGround() { } }
ソースコードを見る限り、恐らくisGroundがtrueにならないことが原因だと思います。
ありがちなのは
・Rayの始点(transform.position)が地面やブロックの表面より下にあるので衝突していない
・地面やブロック以外のオブジェクトに先にぶつかってif(hit.collider.tag == "isGround")を満たせていない
などです。 Debug.Log(hit.collider.tag); とでも入れて確認してみてください。
「うまくできません」にも色々ありますので、他のDebug.Logの表示状況を記載すると回答が付きやすいと思います。
文章を編集しました。
質問ですがrayの開始地点というのはこの場合キャラクターの中心から↓に伸びてる線?みたいなことでいいのでしょうか?参考サイト: https://www.sejuku.net/blog/83620
if(hit.collider.tag == "isGround")
って一文省いたら行けませんか?
なんか地面以外に当たっていない気がします。
操作した内容と、Debug.logで出力された内容をそのまま質問内に記載してください。
また、「Debug.Log(hit.collider.tag); とでも入れて確認してみてください。」の部分を検証してください。
>rayの開始地点=線?
線のray.originが開始地点です。
あなたの回答
tips
プレビュー