Beispiel #1
0
    /// <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);
    }
Beispiel #2
0
    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);
        }
    }
Beispiel #3
0
    /// <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));
        }
    }