#概要
UnityでcharacterControllerを使ってFPSのコントローラーを今作っているのですが、ウォールラン中に壁がない方向に飛ぶウォールジャンプの機能がうまくできません。
#コードの説明
Raycastで左か右かにウォールランできる壁があるかどうかを検知、壁が右にある状態でDキー(右移動キー)を押すまたは、壁が左にある状態でAキー(左移動キー)を押すウォールラン開始でウォールラン中は重力を与えないようにしておきます。
その状態でスペースキーを押すと加速度用のvector3のvelocityに値を壁のない方のX方向上のY方向に入れそしてvelocityはMove関数(コードの真ん中らへん)でTime.deltatimeをかけてCharacterControlle.Moveで動かすのですが実際ジャンプしてもX方向にしか動きません。
#検証してことについて
別のスクリプトでDキーを押したら横にCharacterControllerで動く、スペースキーをおしたら上に同じような方法でジャンプする、同じ方法で重力も与えるこの機能のスクリプトをゲームオブジェクトのカプセルにつけてキャラクターコントローラーもつけるこの状態でDを押して移動先にキューブを置いてぶつけるキューブにぶつけてDを押し続けてジャンプすると全く動きません壁キックできないのはこれと一緒の原因何のかなと思いますどう解決したらいいでしょうか?
今のコード
c#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class PlayerAll : MonoBehaviour 6{ 7 float rotaX,rotaZ; 8 float inputCamX, inputCamY; 9 public float sense = 400; 10 public Transform player; // 空のオブジェクトにアタッチ 11 public float friction = -3; 12 13 float inputX, inputY; 14 Vector3 move, velocity; 15 CharacterController controller; 16 bool isGrounded; 17 18 public Transform groundCheck;//playerの子にある空のゲームオブジェクト足元にある 19 public LayerMask groundMask; 20 21 public float groundDistans = 0.4f;//CheckSphere用 22 public float gravity = -9.81f; 23 public float walkSpeed, runSpeed, jumpPower; 24 25 26 bool isWallJump; 27 bool isWallRun, rightWallRun, leftWallRun; 28 public Transform camTrans; //playerの子にあるカメラ 29 public LayerMask wallMask; 30 public float wallDistans = 0.7f;//RayCast用 31 32 public AnimationCurve camShakeCurve;//0から始まり最大1 最小-1 33 public float shakeSpeed; 34 float time = 0; 35 float shakeX, shakeY; 36 37 38 private void Awake() 39 { 40 Cursor.lockState = CursorLockMode.Locked; 41 rotaX = 0.0f; 42 rotaZ = 0.0f; 43 } 44 // Start is called before the first frame update 45 void Start() 46 { 47 controller = GetComponent<CharacterController>(); 48 } 49 50 // Update is called once per frame 51 void Update() 52 { 53 Camangl(); 54 WallRun(); 55 MoveData(); 56 Move(); 57 } 58 59 60 61 62 63 void MoveData() 64 { 65 isGrounded = Physics.CheckSphere(groundCheck.position, groundDistans, groundMask); 66 67 //水平、垂直の値取得 68 inputX = Input.GetAxis("Horizontal"); 69 inputY = Input.GetAxis("Vertical"); 70 71 move = transform.right * inputX + transform.forward * inputY; 72 73 74 //スペースでジャンプ 75 if (Input.GetKey(KeyCode.Space) && isGrounded && !isWallRun) 76 { 77 velocity.y = Mathf.Sqrt(jumpPower * -2 * gravity); 78 } 79 80 81 //壁走りしてなくて床についてなかったら重力を加える 82 if (!isWallRun && !controller.isGrounded) 83 { 84 //壁ジャンプのxの力消し 85 if(velocity.x != 0) 86 { 87 if(velocity.x < 0) 88 velocity.x -= friction * Time.deltaTime; 89 else 90 velocity.x += friction * Time.deltaTime; 91 } 92 93 94 velocity.y += gravity * Time.deltaTime; 95 } 96 //壁走り中は重力ベクトルを消す 97 else if (isWallRun) 98 { 99 velocity.y = 0.0f; 100 } 101 } 102 103 104 105 106 107 void Move() 108 { 109 if (isGrounded && velocity.y < 0) 110 { 111 velocity.x = 0; 112 velocity.y = -6; 113 } 114 115 //シフトキー押して走る 116 if (Input.GetKey(KeyCode.LeftShift)) 117 { 118 if (isGrounded || isWallRun) 119 { 120 CamShake(); 121 } 122 controller.Move(move * runSpeed * Time.deltaTime); 123 } 124 125 //シフトキー押してないときは歩く 126 else 127 { 128 if (isGrounded || isWallRun) 129 { 130 CamShake(); 131 } 132 controller.Move(move * walkSpeed * Time.deltaTime); 133 } 134 135 controller.Move(velocity * Time.deltaTime); 136 } 137 138 //カメラ揺れ 139 void CamShake() 140 { 141 time += Time.deltaTime; 142 143 shakeX = camShakeCurve.Evaluate(time) * Mathf.Abs(shakeSpeed * inputY); 144 shakeY = -camShakeCurve.Evaluate(time) * Mathf.Abs(shakeSpeed * inputY); 145 146 camTrans.localPosition = new Vector3(shakeY, shakeX + 1.5f, 0); 147 148 if (time > 4.0f) 149 time = 0; 150 } 151 152 153 //FPSカメラ 154 private void Camangel() 155 { 156 inputCamX = Input.GetAxis("Mouse X") * sense * Time.deltaTime; 157 inputCamY = Input.GetAxis("Mouse Y") * sense * Time.deltaTime; 158 159 rotaX -= inputCamY; 160 rotaX = Mathf.Clamp(rotaX, -45.3f, 45.3f); 161 162 camTrans.localRotation = Quaternion.Euler(rotaX, 0, rotaZ); 163 camTrans.Rotate(rotaX, 0, rotaZ); 164 165 player.Rotate(0, inputCamX, 0); 166 } 167void WallRun() 168 { 169 //壁があるかどうか 170 leftWallRun = Physics.Raycast(transform.position, -transform.right, wallDistans, wallMask); 171 rightWallRun = Physics.Raycast(transform.position, transform.right, wallDistans, wallMask); 172 173 //右壁走り 174 if (Input.GetKey(KeyCode.D) && rightWallRun) 175 { 176 isWallRun = true; 177 178 179 //カメラ傾き 180 if (camTrans.localEulerAngles.z < 20) 181 { 182 rotaZ += 0.2f; 183 } 184 } 185 186 //左壁走り 187 else if (Input.GetKey(KeyCode.A) && leftWallRun) 188 { 189 isWallRun = true; 190 191 //カメラ傾き 192 if (camTrans.localEulerAngles.z < 10f) 193 rotaZ -= 0.2f; 194 else if (camTrans.localEulerAngles.z > 340) 195 { 196 rotaZ -= 0.2f; 197 } 198 199 //ウォールジャンプ 200 if (Input.GetKey(KeyCode.Space) && !isWallJump) 201 { 202 isWallJump = true; 203 isWallRun = false; 204 velocity.x = 30 * transform.right; 205 velocity.y = 30; 206 } 207 } 208 209 //どっちでもないとき 210 else 211 { 212 isWallJump = false; 213 214 215 //カメラ傾き戻し 216 if(camTrans.localEulerAngles.z > 180 ) 217 { 218 rotaZ += 0.2f; 219 } 220 else if(camTrans.localEulerAngles.z < 180 && camTrans.localEulerAngles.z > 0.2f) 221 { 222 rotaZ -= 0.2f; 223 224 } 225 226 isWallRun = false; 227 } 228 } 229}
補足情報(FW/ツールのバージョンなど)
unity2019.3.9f1personal
visualstudio2019
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。