Я работаю на местности, я сделал эту яму, и мой персонаж-контроллер действует как
он находится на земле, но он точно плывет, и когда я двигаюсь вперед, он притягивается гравитацией, но он снова «застревает», плавающий, и если я нахожусь на дне ямы и пытаюсь подняться, он фактически поднимается большой уклон, в то время как мой предел наклона равен 45, и он считается как заземленный, так что я могу прыгнуть снова, и да, я попытался сделать raycast, чтобы проверить, заземлен ли он, но все же он только устраняет проблему с лазанием, но все равно, если я прыгаю по бокам яму я начну плавать.
Вот сценарий.
using UnityEngine;
using System.Collections;
public class moveController : MonoBehaviour
{
private CharacterController controller;
public float moveSpeed = 15f;
public float jumpForce = 15f;
private Vector3 moveDirection;
private float gravityScale = 0.1f;
private float up_Down;
private float right_Left;
private float mouseX;
private float mouseY;
//headbob
private float currentAngle = 0;
private float smooth = 20.0F;
private float tiltAngle = 1.0F;
private float tiltAroundZ;
Vector3 h_bob;
//AccelerationVariables
private float jumpVelocityPerSecond = 3f;
private float speedVelocityPerSecond = 3f;
// jump or not , moving or not , walking or not,
private bool isJumping;
private bool isMoving;
private bool isWalking;
// look variables
Vector2 mouselook;
Vector2 smoothV;
private float smoothing = 2f;
private float sensitivity = 1.5f;
private Camera eyes;
private void Awake()
{
controller = GetComponent<CharacterController>();
eyes = Camera.main;
}
void Start()
{
}
void Update()
{
Move();
SlowDown();
//DeadHop();
// MaxSpeed_Jump();
Crouch();
}
private void Move()
{
// moveDirection = new Vector3(Input.GetAxis("Horizontal") * moveSpeed, moveDirection.y, Input.GetAxis("Vertical") * moveSpeed);
up_Down = Input.GetAxis("Vertical");
right_Left = Input.GetAxis("Horizontal");
mouseX = Input.GetAxis("Mouse X");
mouseY = Input.GetAxis("Mouse Y");
tiltAroundZ = Input.GetAxis("Horizontal") * tiltAngle;
currentAngle = Mathf.MoveTowards(currentAngle, tiltAroundZ, Time.deltaTime * smooth);
Vector3 moveDirSide = transform.right * right_Left * moveSpeed;
Vector3 moveDirForward = transform.forward * up_Down * moveSpeed ;
Vector3 BodyRot = transform.rotation.eulerAngles;
BodyRot.y += mouseX;
var md = new Vector2(mouseX, mouseY);
md = Vector2.Scale(md, new Vector2(sensitivity * smoothing, sensitivity * smoothing));
smoothV.x = Mathf.Lerp(smoothV.x, md.x, 1f / smoothing);
smoothV.y = Mathf.Lerp(smoothV.y, md.y, 1f / smoothing);
mouselook += smoothV;
mouselook.y = Mathf.Clamp(mouselook.y, -80f, 80f);
// check if he is moving
if (Input.GetButton("Horizontal"))
{
isMoving = true;
}
else if (Input.GetButton("Vertical"))
{
isMoving = true;
}
else
{
isMoving = false;
}
// check if he is jumping
if (Input.GetButton("Jump"))
{
isJumping = true;
}
else if (Input.GetButtonUp("Jump"))
{
isJumping = false;
}
///check if grounded so he can jump
if (controller.isGrounded)
{
if (isJumping)
{
moveDirection.y = jumpForce;
}
}
moveDirection.y = moveDirection.y + (Physics.gravity.y * gravityScale);
controller.Move(moveDirSide * Time.deltaTime);
controller.Move(moveDirForward * Time.deltaTime);
controller.Move(moveDirection * Time.deltaTime);
eyes.transform.localRotation = Quaternion.Euler(-mouselook.y, Vector3.right.x, -currentAngle);
transform.localRotation = Quaternion.AngleAxis(mouselook.x, BodyRot);
}
a
private void SlowDown()
{
if (Input.GetButton("SlowDown"))
{
moveSpeed = 5f;
jumpForce = 10f;
isWalking = true;
}
else if (Input.GetButtonUp("SlowDown"))
{
moveSpeed = 15f;
jumpForce = 15f;
isWalking = false;
}
}
//private void DeadHop()
//{
// if (isMoving)
// {
// jumpForce += jumpVelocityPerSecond * Time.deltaTime ;
// moveSpeed += speedVelocityPerSecond * Time.deltaTime ;
// }
// else if (isMoving == false)
// {
// jumpForce = 10f;
// moveSpeed = 10f;
// }
//}
//private void MaxSpeed_Jump()
//{
// if(moveSpeed >= 15)
// {
// moveSpeed = 15;
// }
// if(jumpForce >= 15)
// {
// jumpForce = 15;
// }
//}
private void Crouch()
{
if (Input.GetButton("Crouch") && isJumping == false)
{
controller.height = 1.5f;
moveSpeed = 5f;
}
else if (Input.GetButtonUp("Crouch") && isJumping == false)
{
moveSpeed = 15f;
controller.height = 3f;
}
if (Input.GetButton("Crouch") && isJumping == true)
{
controller.height = 1.5f;
}
else if (Input.GetButtonUp("Crouch") && isJumping == true)
{
moveSpeed = 15f;
controller.height = 3f;
}
}
}
![enter image description here](https://i.stack.imgur.com/pcgm2.png)
![enter image description here](https://i.stack.imgur.com/2Ave4.png)