わからないこと
先日charactercontrollerを用いたアクションゲームを制作していて、斜面を滑るようにしたく、何か方法はないか探していたところ、以下のコードで斜面の角度に応じて滑らせることができました。
(このような状況で滑り落ちるといものです)
大まかな流れは理解できるのですが細かい点で理解できないところがあるので、説明するのは難しいかもしれませんが、もしわかる方がいれば教えていただきたいです。
1.lastHitPointのx座標を無限にする理由
2.**(hit.point - lastHitPoint).sqrMagnitude > 0.001f **この条件式の意味
該当のソースコード
このコードで斜面の角度を取得
public float groundAngle = 0;
public Vector3 groundNormal = Vector3.zero;
private Vector3 lastGroundNormal = Vector3.zero; private Vector3 **lastHitPoint**= new Vector3(**Mathf.Infinity**, 0, 0);
void OnControllerColliderHit(ControllerColliderHit hit)
{
if (hit.normal.y > 0 && hit.moveDirection.y < 0) { if (**(hit.point - lastHitPoint).sqrMagnitude > 0.001f** || lastGroundNormal == Vector3.zero) { groundNormal = hit.normal; } else { groundNormal = lastGroundNormal; } lastHitPoint = hit.point; } // 現在の接地面の角度を取得 groundAngle = Vector3.Angle(hit.normal, Vector3.up); }
このコードで滑らせる
void FixedUpdate()
{
Vector3 moveDirection = Vector3.zero;
// 中略 (ここで移動やジャンプに応じてmoveDirectionを修正) // 地上で斜面にいる場合はその方向へ滑らせる if (IsGrounded() && characterController.slopeLimit <= groundAngle) { float slidingSpeed = 5f; moveDirection.x += groundNormal.x * slidingSpeed; moveDirection.y -= groundNormal.y * slidingSpeed; moveDirection.z += groundNormal.z * slidingSpeed; } // CharacterControllerで移動 characterController.Move(moveDirection * Time.deltaTime);
}
public bool IsGrounded()
{
return characterController.isGrounded && (groundNormal.y > 0.01);
}
あなたの回答
tips
プレビュー