Exemple #1
0
    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);
            }
        }
    }
Exemple #2
0
    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;
        }
    }