Hello.
I need help.
How can i stop calling the function Move when the player is attacking and after he is done attacking call the function back so he can move ?
I am trying to do this through booleans.But the problem is when the game starts i want the player to be able to move or attack.I don’t know how to set this up the right way so the player can attack or move.
I must be blind.I’ve tried to set this up through float numbers this doesn’t work and it is not a good way to set it up.
Anybody can help me ?
This is my code
public float walkSpeed = 2;
public float runSpeed = 6;
public float gravity = -12;
public float jumpHeight = 1;
[Range(0, 1)]
public float airControlPercent;
public float turnSmoothTime = 0.2f;
float turnSmoothVelocity;
public float speedSmoothTime = 0.1f;
float speedSmoothVelocity;
float currentSpeed;
float velocityY;
public float SwordSwingTime = 2f;
Animator animator;
Transform cameraT;
CharacterController controller;
//BOOLEANS//
public bool CanAttack;
public bool CanMove;
void Start()
{
animator = GetComponentInChildren<Animator>();
cameraT = Camera.main.transform;
controller = GetComponent<CharacterController>();
CanAttack = true;
CanMove = true;
}
void Update()
{
// input
Vector2 input = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"));
Vector2 inputDir = input.normalized;
bool running = Input.GetKey(KeyCode.LeftShift);
if(CanMove == true)
{
CanAttack = false;
Move(inputDir, running);
}
else { CanAttack = true; }
if (CanAttack == true && Input.GetButtonDown("Fire1"))
{
StartCoroutine(SwordAttackQUICK());
CanMove = false;
}
if (Input.GetKeyDown(KeyCode.Space))
{
Jump();
}
// animator
float animationSpeedPercent = ((running) ? currentSpeed / runSpeed : currentSpeed / walkSpeed * .5f);
animator.SetFloat("SpeedPercent", animationSpeedPercent, speedSmoothTime, Time.deltaTime);
}
void Move(Vector2 inputDir, bool running)
{
if (inputDir != Vector2.zero)
{
float targetRotation = Mathf.Atan2(inputDir.x, inputDir.y) * Mathf.Rad2Deg + cameraT.eulerAngles.y;
transform.eulerAngles = Vector3.up * Mathf.SmoothDampAngle(transform.eulerAngles.y, targetRotation, ref turnSmoothVelocity, GetModifiedSmoothTime(turnSmoothTime));
}
float targetSpeed = ((running) ? runSpeed : walkSpeed) * inputDir.magnitude;
currentSpeed = Mathf.SmoothDamp(currentSpeed, targetSpeed, ref speedSmoothVelocity, GetModifiedSmoothTime(speedSmoothTime));
velocityY += Time.deltaTime * gravity;
Vector3 velocity = transform.forward * currentSpeed + Vector3.up * velocityY;
controller.Move(velocity * Time.deltaTime);
currentSpeed = new Vector2(controller.velocity.x, controller.velocity.z).magnitude;
if (controller.isGrounded)
{
velocityY = 0;
}
}
void Jump()
{
if (controller.isGrounded)
{
float jumpVelocity = Mathf.Sqrt(-2 * gravity * jumpHeight);
velocityY = jumpVelocity;
}
}
float GetModifiedSmoothTime(float smoothTime)
{
if (controller.isGrounded)
{
return smoothTime;
}
if (airControlPercent == 0)
{
return float.MaxValue;
}
return smoothTime / airControlPercent;
}
IEnumerator SwordAttackQUICK()
{
CanMove = false;
animator.SetBool("Attacking", true);
animator.SetInteger("RandomAttack", Random.Range(1, 4));
CanAttack = false;
yield return new WaitForSeconds(SwordSwingTime);
animator.SetInteger("RandomAttack", 0);
animator.SetBool("Attacking", false);
CanAttack = true;
CanMove = true;
}
}