protected override void OnPressing(Vector3 pos)
    {
        base.OnPressing (pos);

        if (Time.time - m_LastPressingTime < PRESSING_DELAY)
        {
            return;
        }

        m_LastPressingTime = Time.time;

        if (null == m_PlayerPawn)
        {
            Debug.LogError ("[PlayerMovementInputController] player pawn is not set.");
            return;
        }

        Ray ray = m_MainCamera.ScreenPointToRay (pos);
        RaycastHit hit;
        if (Physics.Raycast (ray, out hit))
        {
            TAG tag = hit.collider.GetComponent<TAG> ();
            if (null == tag)
            {
                // Collider has no tag
                Debug.LogError ("[PlayerMovementInputController] Collider has no tag. \n" +
                    "Since I want to use collider only as input test, collider without tag make no sense.");
                return;
            }

            if (tag.HasTag (TAG.TAG_TYPES.WALKABLE))
            {
                MoveActionModel model = new MoveActionModel ();
                model.OwnerPawn = m_PlayerPawn;
                model.TargetPosition = hit.point;
                model.IsHostileToTarget = true;
                m_PlayerPawn.AddAction (model, true);
            }
            else
            if (tag.HasTag (TAG.TAG_TYPES.ATTACKABLE))
            {
                AttackActionModel model = new AttackActionModel ();
                model.OwnerPawn = m_PlayerPawn;
                model.TargetObject = hit.collider.gameObject;
                m_PlayerPawn.AddAction (model, true);
            }
        }
    }
Exemple #2
0
    protected override void OnAction()
    {
        Vector3 delta = OwnerPawn.transform.position - TargetObject.transform.position;

        /// gather NavMeshAgent radius of owner pawn and target object
        float radRange = OwnerPawn.MoveAgentRefer.radius;
        if (TargetObject.GetComponent<NavMeshAgent> () != null)
        {
            radRange += TargetObject.GetComponent<NavMeshAgent> ().radius;
        }
        float sum = OwnerPawn.Data.AttackData.AttackRange + radRange + PawnDataModel.ATTACK_TO_MOVE_ALLOW_GAP;

        if (delta.magnitude < sum)
        // if target is in attack range,
        {
            // target inside attack range
            Debug.Log ("Do Damage to target: " + TargetObject.name + ", damage: " + OwnerPawn.Data.AttackData.AttackDamage);

            /// owner pawn plays attack animation
            OwnerPawn.AnimatorRefer.Play (ANIM_STATE_KEY_ATTACK, -1, 0.0F);
            OwnerPawn.transform.LookAt (TargetObject.transform);

            /// Display get hit if target object has pawn and animator comp
            Pawn targetPawn = TargetObject.GetComponent<Pawn> ();
            Animator targetAnimator = TargetObject.GetComponentInChildren<Animator> ();
            if (null != targetPawn && targetPawn.IsIdle && null != targetAnimator)
            {
                targetAnimator.Play (ANIM_STATE_KEY_GETHIT, -1, 0.0F);
            }

            /// Dispatch event
            OwnerPawn.OnAttack ();
            if (null != targetPawn)
            {
                targetPawn.OnGetHit ();
            }

            /// Determine attack speed. will block movement of owner pawn.
            OwnerPawn.StartCoroutine (WaitForAttackDelay ());
        }
        else
        // if target outside attack range,
        {
            MoveActionModel moveModel = new MoveActionModel ();
            moveModel.OwnerPawn = OwnerPawn;
            moveModel.TargetObject = TargetObject;
            moveModel.IsHostileToTarget = true;
            OwnerPawn.AddAction (moveModel, true);

            AttackActionModel attackModel = new AttackActionModel ();
            attackModel.OwnerPawn = OwnerPawn;
            attackModel.TargetObject = TargetObject;
            OwnerPawn.AddAction (attackModel, false);

            NextFlow ();
        }
    }