前提・実現したいこと
こちらの動画で、
キャラクターコントローラの実装を勉強しているのですが、処理として意図が分からないものがあるため、
ご教示お願いします。
なお、動画では、ジャンプコードも実装していますが、そこに辿り着くまでに分からない点が多いので、
ジャンプコードに関しては今回考えないです。
試したこと
ジャンプコードは考えない、かつ、重力のログや地面接地判定の状態を調べる為、下記コードで試しました。
C#
1 [SerializeField] 2 float speed = 12f; 3 float gravity = -9.81f; 4 [SerializeField] 5 Transform groundCheck; 6 [SerializeField] 7 float groundDistance = 0.4f; 8 Vector3 velocity; 9 10 bool isGrounded; 11 12 // Start is called before the first frame update 13 void Start() 14 { 15 16 } 17 18 // Update is called once per frame 19 void Update() 20 { 21 float x = Input.GetAxis("Horizontal"); 22 float z = Input.GetAxis("Vertical"); 23 24 isGrounded = Physics.CheckSphere(groundCheck.position, groundDistance); 25 26 if(isGrounded && velocity.y < 0){ 27 velocity.y = -2f; 28 } 29 30 Vector3 move = transform.right * x + transform.forward * z; 31 32 controller.Move(move * speed * Time.deltaTime); 33 34 velocity.y += gravity * Time.deltaTime; 35 36 controller.Move(velocity * Time.deltaTime); 37 38 Debug.Log(velocity.y); 39 40 } 41 42 void OnDrawGizmos(){ 43 Gizmos.DrawWireSphere(groundCheck.position, groundDistance); 44 }
構造は以下です。
Cubeをキャラクターと見立てて、Cubeにスクリプトやキャラクターコントローラをアタッチしています。
・質問1。
C#
1 [SerializeField] 2 float groundDistance = 0.4f;
調整値だとは思いますが、これを0.4fとした場合、
groundCheckオブジェクトを下記のような位置にセットするのが、正しい設定ということですか?
(CheckSphereがプレイヤー自身に接触しない、かつ、地面として判定する場所にgroundCheckオブジェクトをセットするということでしょうか?)
・質問2。
C#
1controller.Move(velocity * Time.deltaTime);
検索して重力加速度の公式がv=gtであることがわかったので、
上記コードで重力をかけるのはわかったのですが、動画では、上記コードを書く前に、
y=1/2gt^2の式を提示しているのですが(16:44辺り)、y=1/2gt^2はなぜ動画で提示されていますか?
(コードで使っている様子はなかったので。)
・質問3。
下記はどういう意図のコードでしょうか?
地面に設置してたら、重力加速度が無限に大きくなり続けるのを防ぐためにリセットしているかと思うのですが(そもそもその解釈で合っていますか?)、
まず、velocity.y < 0 ということを条件の1つとしていますが、
float gravity = -9.81f
で、
velocity.y += gravity * Time.deltaTime;
としているので、基本的にvelocity.y < 0 の状態になっているかと思うのですが、
velocity.y < 0 をチェックに入れる必要はありますか?
C#
1 if(isGrounded && velocity.y < 0){ 2 velocity.y = -2f; 3 }
あと、最初、動画では、
C#
1 if(isGrounded && velocity.y < 0){ 2 velocity.y = 0; 3 }
としていましたが、最終的にvelocity.y = -2f; にした理由は何ですか?
両方のパターンでゲームを実行して見てみたのですが、動きとしての違いがわかりませんでした。
ログでは、地面接地時にvelocity.yが0付近に留まっているか、-2付近に留まっているかの数の違いだけあることはわかりました。
回答1件
あなたの回答
tips
プレビュー