- Home /
Achieved Prone & Crouch, but there is a little question in my mind. (Character Controller)
Hello everyone, I was able to write some Crouch & Prone codes for my player. What it does is, it checks the inputs and correctly calls some Coroutines according to them. In those coroutines, I simply lerp the character controller's height & center variables to some values that I adjust over the inspector. I also know that, when standing up, meaning that increasing height & center, I need to move the controller up a little bit in order to prevent it from falling through the floor. I did that too, but the problem is, because I do the "moving up" part by affecting the transform values of the controller, while standing up, player cannot move.(For example, think that I hold my finger on the d key, which makes the player to move right, I crouch without any problems, but when I try to stand up, player stops moving right, stands up and then continues to move right, and ofcourse it is because I affect the transform when standing up, which prevents the script to move according to input.) I wonder if there is any solution or any other way around for that ? Here is my code :
IEnumerator Stand()
{
if(currentStand != 0)
{
currentStand = 0;
if (co_Crouch != null)
StopCoroutine(co_Crouch);
if (co_Prone != null)
StopCoroutine(co_Prone);
float i = 0.0f;
float rate = 1.0f;
if (currentStand == 1)
rate = rate / standSpeedFromCrouch;
else if (currentStand == 2)
rate = rate / standSpeedFromProne;
float currentHeight = controller.height;
float currentCenterY = controller.center.y;
Vector3 currentPos = transform.position;
Vector3 currentCamAnimsPos = camAnims.localPosition;
while (i < 1.0f)
{
i += Time.deltaTime * rate;
controller.height = Mathf.Lerp(currentHeight, originalHeight, i);
controller.center = new Vector3(controller.center.x, Mathf.Lerp(currentCenterY, originalCenterY, i), controller.center.z);
transform.position = Vector3.Lerp(currentPos, currentPos + new Vector3(0, upOffset, 0), i); // this is the part where we move the player up a little bit to prevent it from falling down the below mesh.
camAnims.localPosition = Vector3.Lerp(currentCamAnimsPos, new Vector3(currentCamAnimsPos.x, originalCamHeight, currentCamAnimsPos.z), i);
yield return null;
}
}
}
So you see how I lerp it, is the problem happening because all this coroutine thing, or another reason ? I moved it up in coroutine because it looks well, the best solution that I've found so far. But maybe there is some other way to prevent it from falling down when changing the center & height variables to original values that I do not know. Thanks in advance :)