Inheritance: MonoBehaviour
示例#1
0
    private void StartWatering()
    {
        Waterable waterable = WaterTargets[0];

        waterable.Water();
        CurrentWaterMeter = Mathf.Max(0, CurrentWaterMeter - waterable.WateringCost);
        WateringFinished  = Time.fixedTime + waterable.WateringTimeNecessary;
    }
示例#2
0
    private void OnTriggerEnter(Collider other)
    {
        Waterable waterable = other.gameObject.GetComponent(typeof(Waterable)) as Waterable;

        if (waterable != null)
        {
            fairyAI.FoundWaterTarget(waterable);
        }
    }
示例#3
0
 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);
 }
示例#4
0
    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();
            }
        }
    }
示例#5
0
    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();
            }
        }
    }
示例#6
0
    // 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;
    }
示例#7
0
 /**
  * Used to queue a Waterable object for the fairy to go and water.
  **/
 public void FoundWaterTarget(Waterable waterable)
 {
     WaterTargets.Add(waterable);
 }