- Home /
Is this a good way to implement a dash for my first person controller?
Hi, total noob here. I decided to implement a dash using DOTween since it seemed simple enough and it is, I'm just wondering if there's a better way to do it. Basically I created empty objects attached a certain distance to the sides, front and back of the player, so to dash I call:
transform.DOMove(dashTarget.position, 0.3f);
And it just works.
The thing is I just now realized I want my player to dash diagonally as well, so I'd have to create four extra empty objects and assign them as dash targets as well. While this is no problem, I wonder if I'm making things more cumbersome or complicated than what they need to be because of my lack of knowledge in coding. Also, would this method have any impact on performance? Any help is appreciated, I'll leave my code below.
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using DG.Tweening;
using UnityEngine.UIElements;
public class PlayerMovement : MonoBehaviour
{
public CharacterController controller;
public float speed = 12f;
public float gravity = -9.81f;
public float jumpHeight = 3f;
public float sprintSpeed = 18f;
public Transform groundCheck;
public float groundDistance = 0.4f;
public LayerMask groundMask;
Vector3 velocity;
bool isGrounded;
[SerializeField]
private Transform dashTarget;
[SerializeField]
private Transform leftDashTarget;
[SerializeField]
private Transform rightDashTarget;
[SerializeField]
private Transform backDashTarget;
[SerializeField]
private bool canDash = true;
private void Start()
{
canDash = true;
}
// Update is called once per frame
void Update()
{
isGrounded = Physics.CheckSphere(groundCheck.position, groundDistance, groundMask);
if(isGrounded && velocity.y < 0)
{
velocity.y = -2f;
}
float x = Input.GetAxis("Horizontal");
float z = Input.GetAxis("Vertical");
Vector3 move = transform.right * x + transform.forward * z;
controller.Move(move * speed * Time.deltaTime);
if(Input.GetKey(KeyCode.LeftShift))
{
speed = sprintSpeed;
}
if(Input.GetKeyUp(KeyCode.LeftShift))
{
speed = 12f;
}
if(Input.GetKeyDown(KeyCode.Space) && isGrounded)
{
velocity.y = Mathf.Sqrt(jumpHeight * -2f * gravity);
}
velocity.y += gravity * Time.deltaTime;
controller.Move(velocity * Time.deltaTime);
if (canDash == true)
{
Dash();
}
}
void Dash()
{
if (Input.GetMouseButtonDown(1) && Input.GetKey(KeyCode.A))
{
transform.DOMove(leftDashTarget.position, 0.3f);
canDash = false;
StartCoroutine(DashCooldown());
}
else if (Input.GetMouseButtonDown(1) && Input.GetKey(KeyCode.D))
{
transform.DOMove(rightDashTarget.position, 0.3f);
canDash = false;
StartCoroutine(DashCooldown());
}
else if (Input.GetMouseButtonDown(1) && Input.GetKey(KeyCode.S))
{
transform.DOMove(backDashTarget.position, 0.3f);
canDash = false;
StartCoroutine(DashCooldown());
}
else if (Input.GetMouseButtonDown(1))
{
transform.DOMove(dashTarget.position, 0.3f);
canDash = false;
StartCoroutine(DashCooldown());
}
}
private IEnumerator DashCooldown()
{
yield return new WaitForSeconds(1f);
canDash = true;
}
}