private void StartWatering() { Waterable waterable = WaterTargets[0]; waterable.Water(); CurrentWaterMeter = Mathf.Max(0, CurrentWaterMeter - waterable.WateringCost); WateringFinished = Time.fixedTime + waterable.WateringTimeNecessary; }
private void OnTriggerEnter(Collider other) { Waterable waterable = other.gameObject.GetComponent(typeof(Waterable)) as Waterable; if (waterable != null) { fairyAI.FoundWaterTarget(waterable); } }
private bool CanWater() { if (WaterTargets.Count > 0) { Waterable nextWaterable = WaterTargets[0]; if (nextWaterable.Watered == true || CurrentWaterMeter < MeterNeededToWater) { WaterTargets.RemoveAt(0); return(CanWater()); } return(true); } return(false); }
void Water() { int layerMask = 1 << LayerMask.NameToLayer("Interactable"); Vector2 castDirection = new Vector2(animator.GetFloat("Horizontal"), animator.GetFloat("Vertical")); RaycastHit2D hit = Physics2D.CircleCast(transform.position, waterAOE, castDirection, 0f, layerMask); if (hit.collider != null) { Waterable m = hit.collider.GetComponent <Waterable>(); if (m) { m.Watered(); } } }
void Water() { int layerMask = 1 << LayerMask.NameToLayer("Interactable"); Vector2 castDirection = new Vector2(animator.GetFloat("Horizontal"), animator.GetFloat("Vertical")); RaycastHit2D[] hits = Physics2D.CircleCastAll((Vector2)transform.position + (castDirection * waterRange), waterAOE, castDirection, 0f, layerMask); Instantiate(waterEffect, (Vector2)transform.position + (castDirection * waterRange), Quaternion.identity); foreach (RaycastHit2D hit in hits) { Waterable m = hit.collider.GetComponent <Waterable>(); if (m) { m.Watered(); } } }
// Update is called once per frame void Update() { dt = Time.deltaTime; t += dt; Vector3 playerVel = PlayerBody.velocity; if (playerVel.y < 0) { playerVel = new Vector3(playerVel.x, 0, playerVel.z); } CurrentWaterMeter = Mathf.Max(0, CurrentWaterMeter - (playerVel.magnitude * WaterDrainRate)); currentMoveState = GetMoveState(); Position = gameObject.transform.position; Vector3 newPosition; switch (CurrentState) { case STATES.IDLE: //Debug.Log("Idle"); if (CanWater()) { CurrentState = STATES.MOVE_TO_WATER; goto case STATES.MOVE_TO_WATER; } if (Vector3.Distance(Position, GetIdealFollowPosition(Player, currentMoveState.VerticalOffset)) < MaxDistance) { newPosition = IdleRoutine(Position, currentMoveState); break; } CurrentState = STATES.FOLLOW; goto case STATES.FOLLOW; case STATES.FOLLOW: //Debug.Log("Follow"); if (CanWater()) { CurrentState = STATES.MOVE_TO_WATER; goto case STATES.MOVE_TO_WATER; } if (Vector3.Distance(Position, GetIdealFollowPosition(Player, currentMoveState.VerticalOffset)) < MaxDistance) { CurrentState = STATES.IDLE; goto case STATES.IDLE; } newPosition = MoveToTarget(Player, currentMoveState, currentMoveState.VerticalOffset); Position = newPosition; break; case STATES.MOVE_TO_WATER: //Debug.Log("Moving To Water"); Waterable waterTarget = WaterTargets[0]; float vOffset = waterTarget.VerticalOffset; if (Vector3.Distance(Position, GetIdealFollowPosition(waterTarget.gameObject, waterTarget.VerticalOffset)) < WaterMaxDistance) { CurrentState = STATES.WATER; StartWatering(); goto case STATES.WATER; } newPosition = MoveToTarget(waterTarget.gameObject, currentMoveState, waterTarget.VerticalOffset); Position = newPosition; break; case STATES.WATER: //Debug.Log("Watering"); if (Time.fixedTime >= WateringFinished) { if (CanWater()) { CurrentState = STATES.MOVE_TO_WATER; goto case STATES.MOVE_TO_WATER; } else { CurrentState = STATES.FOLLOW; goto case STATES.FOLLOW; } } newPosition = Position; // Funky watering movement break; default: //Debug.Log("Woops"); newPosition = Player.transform.position; break; } this.gameObject.transform.position = newPosition; }
/** * Used to queue a Waterable object for the fairy to go and water. **/ public void FoundWaterTarget(Waterable waterable) { WaterTargets.Add(waterable); }