private IEnumerator SmoothDash(DashComp competence, float dx = 0, float dy = 0) { competence.Usable = false; _playerData.CanMove = false; Vector3 dir = dx == 0 && dy == 0 ? Direction() : new Vector3(dx, dy, 0); if ((string)Coffre.Regarder("mode") == "multi" && _playerData.MultiID + "" == (string)Coffre.Regarder("id")) { MultiManager.socket.Send("PINFO DASH " + dir.x + " " + dir.y); } Debug.Log(_playerData.MultiID + " dashing to " + dir.x + " " + dir.y + " ( " + dx + " " + dy); Vector3 direction = CheckObstacles(dir, competence); float step = competence.DistDash * Time.fixedDeltaTime; float t = 0; Vector3 end = transform.position + direction - direction * 0.01f; while ((end - transform.position).magnitude > 0.1f) { t += step; transform.position = Vector3.Lerp(transform.position, end, t); yield return(new WaitForFixedUpdate()); } transform.position = end; _playerData.CanMove = true; yield return(new WaitForSeconds(competence.Cooldown)); competence.Usable = true; }
private IEnumerator Dash(DashComp competence, float dx = 0, float dy = 0) { competence.Usable = false; _playerData.CanMove = false; Vector3 dir = dx == 0 && dy == 0 ? Direction() : new Vector3(dx, dy, 0); if ((string)Coffre.Regarder("mode") == "multi" && _playerData.MultiID + "" == (string)Coffre.Regarder("id")) { MultiManager.socket.Send("PINFO DASH " + dir.y + " " + dir.x); } Vector3 direction = CheckObstacles(dir, competence); transform.position += direction - direction * 0.01f; _playerData.CanMove = true; yield return(new WaitForSeconds(competence.Cooldown)); competence.Usable = true; }
private Vector3 CheckObstacles(Vector3 dir, DashComp competence) { int xDir = dir.x > 0 ? 1 : -1; int yDir = dir.y > 0 ? 1 : -1; PlayerDashEvent.Raise(new EventArgsInt(_playerData.MultiID)); Vector3 playerPos = transform.position - new Vector3(0, _playerData.Height / 2); if (yDir > 0) { playerPos.y += _playerData.FeetHeight; } Vector3 playerPosleft = playerPos + new Vector3(_playerData.Width / 2 * xDir, 0, 0); Vector3 playerPosRight = playerPos + new Vector3(-_playerData.Width / 2 * xDir, 0, 0); RaycastHit2D rayL = Physics2D.Raycast(playerPosleft, dir * competence.DistDash, competence.DistDash, BlockingLayer); RaycastHit2D rayR = Physics2D.Raycast(playerPosRight, dir * competence.DistDash, competence.DistDash, BlockingLayer); if (rayL && rayR) { if (rayL.distance < rayR.distance) { return(dir * rayL.distance); } return(dir * rayR.distance); } if (rayL) { return(dir * rayL.distance); } if (rayR) { return(dir * rayR.distance); } return(dir * competence.DistDash); }