private void HandleAttack() { if (Input.GetMouseButtonDown(0)) { // Attack SetStateAttacking(); Vector3 attackDir = (GetMouseWorldPosition() - GetPosition()).normalized; EnemyHandler enemyHandler = EnemyHandler.GetClosestEnemy(GetPosition() + attackDir * 4f, 20f); bool hitEnemy; if (enemyHandler != null) { //enemyHandler.Damage(this); hitEnemy = true; attackDir = (enemyHandler.GetPosition() - GetPosition()).normalized; transform.position = enemyHandler.GetPosition() + attackDir * -12f; } else { hitEnemy = false; transform.position = transform.position + attackDir * 4f; } float attackAngle = GetAngleFromVectorFloat(attackDir); // Play attack animation if (characterBase.IsPlayingPunchAnimation()) { // Play Kick animation since punch animation is currently active characterBase.PlayKickAnimation(attackDir, (Vector3 impactPosition) => { if (hitEnemy) { impactPosition += GetVectorFromAngle((int)attackAngle) * 4f; Transform impactEffect = Instantiate(GameAssets.i.pfImpactEffect, impactPosition, Quaternion.identity); impactEffect.eulerAngles = new Vector3(0, 0, attackAngle - 90); } }, SetStateNormal); } else { // Play Punch animation characterBase.PlayPunchAnimation(attackDir, (Vector3 impactPosition) => { if (hitEnemy) { impactPosition += GetVectorFromAngle((int)attackAngle) * 4f; Transform impactEffect = Instantiate(GameAssets.i.pfImpactEffect, impactPosition, Quaternion.identity); impactEffect.eulerAngles = new Vector3(0, 0, attackAngle - 90); } }, SetStateNormal); } } }
private void Update() { switch (state) { case State.Normal: enemyTarget = enemyMain.EnemyTargeting.GetActiveTarget(); if (enemyTarget != null) { Vector3 targetPosition = enemyTarget.GetPosition(); enemyMain.EnemyPathfindingMovement.MoveToTimer(targetPosition); float attackDistance = 80f; float targetDistance = Vector3.Distance(GetPosition(), targetPosition); if (targetDistance < attackDistance) { // Target within attack distance int layerMask = ~(1 << GameAssets.i.enemyLayer | 1 << GameAssets.i.ignoreRaycastLayer | 1 << GameAssets.i.shieldLayer); RaycastHit2D raycastHit2D = Physics2D.Raycast(GetPosition(), (targetPosition - GetPosition()).normalized, targetDistance, layerMask); if (raycastHit2D.collider != null && raycastHit2D.collider.GetComponent <Player>()) { // Player in line of sight enemyMain.EnemyPathfindingMovement.Disable(); SetStateAttacking(); Vector3 targetDir = (targetPosition - GetPosition()).normalized; characterBase.PlayPunchAnimation(targetDir, (Vector3 hitPosition) => { // Throw rock enemyTarget = enemyMain.EnemyTargeting.GetActiveTarget(); if (enemyTarget != null) { Vector3 throwDir = (enemyTarget.GetPosition() - hitPosition).normalized; EnemyShuriken enemyShuriken = EnemyShuriken.Create(enemyMain.Enemy, hitPosition, throwDir); } //CMDebug.TextPopup("#", hitPosition); }, () => { // Punch complete enemyMain.EnemyPathfindingMovement.Enable(); SetStateNormal(); }); } } } break; case State.Attacking: break; case State.Busy: break; } }