Skip to content
Snippets Groups Projects
AnimateCircle.cs 3.46 KiB
Newer Older
rchia16's avatar
rchia16 committed
using System.Collections;
using System.Collections.Generic;
using System;
using UnityEngine;
using TMPro;

public class AnimateCircle : MonoBehaviour
{
    public GameObject blockObj;
rchia16's avatar
rchia16 committed

    BlockObjectClass blockObjectClass;
    float inhalePeriod = 0f;
    float exhalePeriod = 0f;
    float maxRuntime = 0f;
    float runtime = 0f;
rchia16's avatar
rchia16 committed

    private bool is_inhale; /* 1 if inhalation, 0 if exhaltion */
    private Vector3 scaleDiff = new Vector3(0.9f, 0.9f, 0.0f);
    private Vector3 originalScale = new Vector3(0.1f, 0.1f, 0.0f);
    private Vector3 finalScale = new Vector3(0.98f, 0.98f, 0.0f);
    private Vector3 inhaleVelocity = new Vector3(0.0f, 0.0f, 0.0f);
    private Vector3 exhaleVelocity = new Vector3(0.0f, 0.0f, 0.0f);
rchia16's avatar
rchia16 committed

Raymond Chia's avatar
Raymond Chia committed
    private Transform parentTransform;
    private Vector3 parentCentrePosition = new Vector3(0f, 0f, 0f);
    private Vector3 parentOffsetPosition;

rchia16's avatar
rchia16 committed
    // Start is called before the first frame update
    void Start()
    {
        is_inhale = true;
        originalScale = this.transform.localScale;
        scaleDiff = finalScale - originalScale;
Raymond Chia's avatar
Raymond Chia committed
        parentTransform = this.GetComponentInParent<Transform>().parent.transform;
        parentOffsetPosition = parentTransform.position;
rchia16's avatar
rchia16 committed

        StateReset();
        this.enabled = false;
rchia16's avatar
rchia16 committed
    }

    // Update is called once per frame
    void Update()
    {
        if(is_inhale)
        {
            UpdateInhaleScale();
        }
        else
        {
            UpdateExhaleScale();
        }
        UpdateRespState();
        UpdateRuntimeState();
        runtime += Time.deltaTime;
    }

    public void ResetAndRun()
    {
        this.enabled = true;
        StateReset();
    }

Raymond Chia's avatar
Raymond Chia committed
    public void MoveToCentre()
    {
        parentTransform.position = parentCentrePosition;
    }

    public void MoveToOffset()
    {
        parentTransform.position = parentOffsetPosition;
    }

    private void OnDisable()
    {
        StateReset();
    }

    void StateReset()
    {
        SetPeriod();
        SetMaxRuntime();
        inhaleVelocity = scaleDiff / inhalePeriod;
        exhaleVelocity = scaleDiff / exhalePeriod;
        this.transform.localScale = originalScale;
        runtime = 0f;
rchia16's avatar
rchia16 committed
    }

    void SetPeriod()
    {
        blockObjectClass = blockObj.GetComponent<BlockObjectClass>();
        inhalePeriod = blockObjectClass.InhalePeriod;
        exhalePeriod = blockObjectClass.ExhalePeriod;
rchia16's avatar
rchia16 committed
    }
    void SetMaxRuntime()
    {
        blockObjectClass = blockObj.GetComponent<BlockObjectClass>();
        maxRuntime = blockObjectClass.MaxRuntime;
rchia16's avatar
rchia16 committed

    void UpdateInhaleScale()
    {
        float dt = Time.deltaTime;
        Vector3 scale = this.transform.localScale;
        this.transform.localScale = inhaleVelocity*dt + scale;
rchia16's avatar
rchia16 committed
    }

    void UpdateExhaleScale()
    {
        float dt = Time.deltaTime;
        Vector3 scale = this.transform.localScale;
        this.transform.localScale = -exhaleVelocity*dt + scale;
rchia16's avatar
rchia16 committed
    }

    void UpdateRespState()
    {
        Vector3 scale = this.transform.localScale;
        if(scale.x >= finalScale.x | scale.x <= originalScale.x)
rchia16's avatar
rchia16 committed
        {
            if (is_inhale)
            {
                this.transform.localScale = finalScale;
rchia16's avatar
rchia16 committed
            }
            else
            {
                this.transform.localScale = originalScale;
rchia16's avatar
rchia16 committed
            }
            is_inhale = !is_inhale;
        }
    }

    void UpdateRuntimeState()
    {
        if (runtime >= maxRuntime)
        {
            StateReset();
            this.enabled = false;
        }
    }
rchia16's avatar
rchia16 committed
}