Ejemplo n.º 1
0
        public void GatherResource(ResourceNode resource)
        {
            if (_isDead)
            {
                return;
            }
            if (!canGather)
            {
                return;
            }
            if (resource.Equals(GatheringTarget))
            {
                return;
            }
            if (GatheringTarget)
            {
                GatheringTarget.RemoveGatherer(teamId);
            }
            _enemyUnit      = null;
            _isGathering    = false;
            inResourceRange = false;

            // Get a Random point around the resource within the gathering radius
            // var vector2 = Random.insideUnitCircle.normalized * resource.gatherRadius;
            // var destination =  resource.transform.position + new Vector3(vector2.x, 0, vector2.y);
            var resourcePosition = resource.transform.position;
            var randomPosition   = Random.insideUnitCircle * resource.gatherRadius;
            var destination      = resourcePosition + new Vector3(randomPosition.x, 0, randomPosition.y);

            NavMesh.SamplePosition(destination, out var hit, 3f, NavMesh.AllAreas);
            GatheringTarget = resource;
            MoveTo(hit.position, false);
            _currentState = UnitState.Gathering;
        }
Ejemplo n.º 2
0
        public void MoveTo(Vector3 destination, bool forceChangeState = true)
        {
            if (_isDead)
            {
                return;
            }

            if (forceChangeState)
            {
                switch (_currentState)
                {
                case UnitState.Combat:
                    _enemyUnit   = null;
                    _isAttacking = false;
                    break;

                case UnitState.Gathering:
                    inResourceRange = false;
                    _isGathering    = false;
                    GatheringTarget.RemoveGatherer(teamId);
                    GatheringTarget = null;
                    break;

                case UnitState.Idle:
                case UnitState.Moving:
                    _currentState = UnitState.Moving;
                    _animator.SetInteger("unitState", 1);
                    break;

                case UnitState.Building:
                    inBuildingRange = false;
                    _isBuilding     = false;
                    BuildingTarget.RemoveBuilder();
                    BuildingTarget = null;
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }

                _agent.stoppingDistance = 0;
            }

            _animator.SetInteger("unitState", 1);
            _agent.speed = moveSpeed.GetValue();
            _agent.SetDestination(destination);
        }
Ejemplo n.º 3
0
        public void Attack(Building enemy)
        {
            if (_isAttacking)
            {
                return;
            }
            if (enemy.teamId == teamId)
            {
                return;
            }
            switch (_currentState)
            {
            case UnitState.Gathering:
                GatheringTarget.RemoveGatherer(teamId);
                _isGathering    = false;
                GatheringTarget = null;
                inResourceRange = false;
                break;

            case UnitState.Building:
                BuildingTarget.RemoveBuilder();
                _isBuilding     = false;
                BuildingTarget  = null;
                inBuildingRange = false;
                break;

            case UnitState.Idle:
                break;

            case UnitState.Moving:
                break;

            case UnitState.Combat:
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            _enemyUnit              = null;
            _enemyBuilding          = enemy;
            _currentState           = UnitState.Combat;
            _agent.stoppingDistance = attackRadius.GetValue();
        }