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); } } }
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 (); } }