/// <summary> /// Tells the current unit to attack target. /// </summary> protected override void SendAttackOrderToUnit(GameObject target) { string debugString = string.Format("Target for attack: {0}", target.name); Debug.Log(debugString); UnitAttackRequest request = new UnitAttackRequest(this.gameObject, target, currentUnit); Debug.Log("Sending attack order to " + currentUnit.name); currentUnit.SendMessage("RequestAttack", request, SendMessageOptions.RequireReceiver); }
public void ExecuteAttack(UnitAttackRequest request) { attackRequest = request; if (request.target.GetComponent<UnitInfo>() == null) { BroadcastMessage("DoneAttacking", NotAUnitResponse(), SendMessageOptions.RequireReceiver); } else if (request.target.GetComponent<UnitInfo>().controller == gameObject.GetComponent<UnitInfo>().controller) { string debugString = string.Format ("Attack target is on the same team as attacker!"); Debug.Log(debugString); BroadcastMessage("DoneAttacking", TeammateResponse(), SendMessageOptions.RequireReceiver); } else if (!withinRange(request.target)) { string debugString = string.Format ("Attack target was distance {0}, but unit's max attack range is {1}", (this.transform.position - request.target.transform.position).magnitude, unitInfo.CalculateAttackRange()); Debug.Log(debugString); BroadcastMessage("DoneAttacking", OutOfRangeResponse(), SendMessageOptions.RequireReceiver); } else { transform.LookAt( new Vector3( attackRequest.target.transform.position.x, transform.position.y, attackRequest.target.transform.position.z)); animation.Play("Attack"); float damage = unitInfo.attackDamage; damage += Random.Range(-damage / 2, damage / 2); attackRequest.target.BroadcastMessage("TakeDamage", damage, SendMessageOptions.RequireReceiver); UnitAttackResponse response = new UnitAttackResponse(request.caller, false, damage); BroadcastMessage("DoneAttacking", response); } }
/// <summary> /// Requests that the unit attack another unit. /// </summary> public void RequestAttack(UnitAttackRequest request) { if (currentState == State.WaitingOrders) { currentState = State.Attacking; SendMessage("ExecuteAttack", request, SendMessageOptions.RequireReceiver); } else if (currentState == State.Attacking) { string LogMsg = "RequestAttack called on {0}, but it's already moving (called by {1})"; Debug.Log(string.Format(LogMsg, this.name, request.attacker.name)); } else { string LogMsg = "RequestMove unexpectedly called on {0} while it is in state \"{1}\" (called by {2})"; Debug.LogWarning(string.Format(LogMsg, this.name, currentState.ToString(), request.attacker.name)); } }