protected override void Awake()
    {
        info          = new WatchInteractionInformation();
        allCoroutines = new Coroutine[12];

        base.Awake();
    }
    protected void UpdateDisplay(ControllerInformation controller)
    {
        LightInteractionInformation info      = (LightInteractionInformation)controller.GetFunctionalityInfoByType(typeof(LightInteractionInformation));
        WatchInteractionInformation watchInfo = (WatchInteractionInformation)controller.GetFunctionalityInfoByType(typeof(WatchInteractionInformation));

        if (watchInfo.watch.activeSelf && vrInteraction.interactingWith == this)
        {
            GameObject correctPart = null;
            if (info.isOnTime)
            {
                if ((watchInfo.isWatchOnFront && interactingLight.StartTime < 13) || (!watchInfo.isWatchOnFront && interactingLight.StartTime > 12))
                {
                    correctPart = ((VRWatchInteraction)vrInteraction).getCorrectPart(interactingLight.StartTime, controller);
                }
            }
            else
            {
                if ((watchInfo.isWatchOnFront && interactingLight.EndTime < 13) || (!watchInfo.isWatchOnFront && interactingLight.EndTime > 12))
                {
                    correctPart = ((VRWatchInteraction)vrInteraction).getCorrectPart(interactingLight.EndTime, controller);
                }
            }
            foreach (var item in watchInfo.allParts)
            {
                if (item != correctPart)
                {
                    ((VRWatchInteraction)vrInteraction).SetPartToNormal(item, controller);
                }
            }
            if (correctPart != null)
            {
                ((VRWatchInteraction)vrInteraction).SetPartToSelected(correctPart, controller);
            }
        }
    }
    private void UpdateTime(ControllerInformation controller)
    {
        LightInteractionInformation info      = (LightInteractionInformation)controller.GetFunctionalityInfoByType(typeof(LightInteractionInformation));
        WatchInteractionInformation watchInfo = (WatchInteractionInformation)controller.GetFunctionalityInfoByType(typeof(WatchInteractionInformation));
        Vector2 touchpadValue = controllerManager.GetController(controller.trackedObj).GetAxis(Valve.VR.EVRButtonId.k_EButton_SteamVR_Touchpad);
        int     time          = ((VRWatchInteraction)vrInteraction).getTimeByVector(touchpadValue);

        if (time != 0)
        {
            if (!watchInfo.isWatchOnFront)
            {
                time += 12;
            }
            if (info.isOnTime && Mathf.Floor(time) != Mathf.Floor(interactingLight.StartTime))
            {
                interactingLight.StartTime = time;
                controllerManager.GetController(controller.trackedObj).TriggerHapticPulse(3000);
                UpdateDisplay(controller);
                if (interactingLight.taskCompleted[2] != null)
                {
                    interactingLight.taskCompleted[2].Invoke();
                }
            }
            else if (Mathf.Floor(time) != Mathf.Floor(interactingLight.EndTime))
            {
                interactingLight.EndTime = time;
                controllerManager.GetController(controller.trackedObj).TriggerHapticPulse(3000);
                UpdateDisplay(controller);
                if (interactingLight.taskCompleted[2] != null)
                {
                    interactingLight.taskCompleted[2].Invoke();
                }
            }
        }
    }
    public void ShowWatch(ControllerInformation controller)
    {
        WatchInteractionInformation info = (WatchInteractionInformation)controller.GetFunctionalityInfoByType(typeof(WatchInteractionInformation));

        info.watch.SetActive(true);
        updateDisplay(controller);
        //foreach (var item in controllerManager.controllerInfos)
        //{
        //    Debug.Log(item.functionalityInformations.Count);
        //}
    }
    private GameObject[] GetOrderedParts(ControllerInformation controller)
    {
        WatchInteractionInformation info = (WatchInteractionInformation)controller.GetFunctionalityInfoByType(typeof(WatchInteractionInformation));

        GameObject[] parts = new GameObject[12];
        for (int i = 0; i < parts.Length; i++)
        {
            parts[i] = info.watch.transform.GetChild(0).Find("Part" + (i + 1)).gameObject;
        }
        return(parts);
    }
    protected override void AnyControllerUpdate(ControllerInformation controller)
    {
        base.AnyControllerUpdate(controller);
        WatchInteractionInformation info = (WatchInteractionInformation)controller.GetFunctionalityInfoByType(typeof(WatchInteractionInformation));

        if (interactingWith)
        {
            if (controllerManager.GetController(controller.trackedObj).GetPressDown(gripButton))
            {
                StartCoroutine(SwitchSide(controller));
            }
        }
        info.watch.transform.LookAt(head);
    }
    protected override void OnControllerInitialized()
    {
        base.OnControllerInitialized();

        foreach (var item in controllerManager.controllerInfos)
        {
            WatchInteractionInformation info = (WatchInteractionInformation)item.GetFunctionalityInfoByType(typeof(WatchInteractionInformation));


            info.watch = Instantiate(watchPrefab, item.trackedObj.transform);
            info.watch.SetActive(false);
            info.allParts = GetOrderedParts(item);
        }
    }
    protected override void AfterControllerIntialized()
    {
        var controllers = controllerManager.controllerInfos;

        for (int i = 0; i < controllers.Length; i++)
        {
            LightInteractionInformation info      = (LightInteractionInformation)controllers[i].GetFunctionalityInfoByType(typeof(LightInteractionInformation));
            WatchInteractionInformation watchInfo = (WatchInteractionInformation)controllers[i].GetFunctionalityInfoByType(typeof(WatchInteractionInformation));

            info.isOnTime = (i == 0 ? true : false);

            info.OnOffTimeObject = (GameObject)Instantiate(accordingTimePrefab[i], watchInfo.watch.transform, false);
            info.OnOffTimeObject.SetActive(false);
        }
    }
    public GameObject getCorrectPart(int time, ControllerInformation controller)
    {
        WatchInteractionInformation info = (WatchInteractionInformation)controller.GetFunctionalityInfoByType(typeof(WatchInteractionInformation));
        int newTime = time;

        if (newTime > 12)
        {
            newTime -= 12;
        }
        if (info.isWatchOnFront)
        {
            return(info.allParts[newTime - 1]);
        }
        else
        {
            return(info.allParts[12 - newTime]);
        }
    }
    public void SetTime(int newTime, ControllerInformation controller)
    {
        WatchInteractionInformation info = (WatchInteractionInformation)controller.GetFunctionalityInfoByType(typeof(WatchInteractionInformation));

        if (timeScript.Time != newTime)
        {
            float f = timeScript.Time - Mathf.Floor(timeScript.Time);
            timeScript.Time    = newTime + f;
            timeScript.isNight = !info.isWatchOnFront;
            OnTimeChanged(timeScript.Time);

            //notification for tutorial
            if (interactingClock.taskCompleted[2] != null)
            {
                interactingClock.taskCompleted[2].Invoke();
            }
        }
    }
    protected void UpdateDisplay(ControllerInformation controller)
    {
        WatchInteractionInformation info = (WatchInteractionInformation)controller.GetFunctionalityInfoByType(typeof(WatchInteractionInformation));

        if (info != null)
        {
            if (info.watch.activeSelf && vrInteraction.interactingWith == this)
            {
                foreach (var item in info.allParts)
                {
                    ((VRWatchInteraction)vrInteraction).SetPartToNormal(item, controller);
                }
                if (info.isWatchOnFront != timeScript.isNight)
                {
                    if (Mathf.FloorToInt(timeScript.Time) - 1 >= 0 && Mathf.FloorToInt(timeScript.Time) - 1 < info.allParts.Length)
                    {
                        ((VRWatchInteraction)vrInteraction).SetPartToSelected(((VRWatchInteraction)vrInteraction).getCorrectPart(Mathf.FloorToInt(timeScript.Time), controller), controller);
                    }
                }
            }
        }
    }
    public IEnumerator SwitchSide(ControllerInformation controller)
    {
        WatchInteractionInformation info = (WatchInteractionInformation)controller.GetFunctionalityInfoByType(typeof(WatchInteractionInformation));

        if (info.isSwitchingSide)
        {
            yield break;
        }
        updateDisplay(controller);
        info.isWatchOnFront  = !info.isWatchOnFront;
        info.isSwitchingSide = true;
        Transform child     = info.watch.transform.GetChild(0);
        Vector3   oldRot    = child.localRotation.eulerAngles;
        Vector3   targetRot = oldRot;

        targetRot.z += 180;
        while (child.transform.localRotation != Quaternion.Euler(targetRot))
        {
            child.transform.localRotation = Quaternion.RotateTowards(child.transform.localRotation, Quaternion.Euler(targetRot), TurnSpeed);
            yield return(0);
        }
        info.isSwitchingSide = false;
    }
    public void HideWatch(ControllerInformation controller)
    {
        WatchInteractionInformation info = (WatchInteractionInformation)controller.GetFunctionalityInfoByType(typeof(WatchInteractionInformation));

        info.watch.SetActive(false);
    }