Inheritance: ForgeEditorDisplayButton
	void OnEnable()
	{
		//lerpFoldout = new AnimBool(true);
		//authoritativeFoldout = new AnimBool(true);
		networkingFoldout = new AnimBool(true);
		easyControls = new AnimBool(true);
		easyControls.target = true;

		_editorStyle = new GUIStyle();
		_editorStyle.normal.textColor = Color.white;
		_editorStyle.fontStyle = FontStyle.Bold;
		_editorStyle.alignment = TextAnchor.UpperCenter;

		Texture2D btnUp = Resources.Load<Texture2D>("HoverIdle");

		// TODO:  Implement
		//Texture2D btnDwn = Resources.Load<Texture2D>("HoverOver");
		//Texture2D btnIcon = Resources.Load<Texture2D>("ForgeAnvil");

		_editorButtons = new List<ForgeEditorDisplayButton>();

		ForgeButtonStyle buttonStyle = new ForgeButtonStyle("Server Is Authority", btnUp, btnUp, null, 75);
		//ForgeSubmitButtonStyle submitButtonStyle = new ForgeSubmitButtonStyle(() =>
		//{
		//	Debug.Log("Submit success");
		//}, "Toggle");

		ServerAuthorityButton serverAuthorityButton = new ServerAuthorityButton(buttonStyle);
		serverAuthorityButton.Initialize(Target.serverIsAuthority, Target.clientSidePrediction, string.Empty,
		(authorityValue)=>
		{
			Target.serverIsAuthority = authorityValue;
		},
		(clientSidePredictionValue)=>
		{
			Target.clientSidePrediction = clientSidePredictionValue;
		});

		_editorButtons.Add(serverAuthorityButton);

		buttonStyle = new ForgeButtonStyle("Networking Throttle", btnUp, btnUp, null, 100);

		NetworkThrottleButton networkingThrottleButton = new NetworkThrottleButton(buttonStyle);
		networkingThrottleButton.Initialize(Target.networkTimeDelay, "This controls how long (in seconds) to wait before updating across the network (priority can be emulated here), this includes [NetSync] vars.",
		(throttle)=>
		{
			Target.networkTimeDelay = throttle;
		});

		_editorButtons.Add(networkingThrottleButton);

		buttonStyle = new ForgeButtonStyle("Interpolation", btnUp, btnUp, null, 175);

		InterpolationButton interpolationButton = new InterpolationButton(buttonStyle);
		interpolationButton.Initialize(Target.interpolateFloatingValues, Target.lerpT, Target.lerpStopOffset, Target.lerpAngleStopOffset, "",
		(interpolation)=>
		{
			Target.interpolateFloatingValues = interpolation;
		},
		(lerpSpeed)=>
		{
			Target.lerpT = lerpSpeed;
		},
		(distanceStop)=>
		{
			Target.lerpStopOffset = distanceStop;
		},
		(angleStop)=>
		{
			Target.lerpAngleStopOffset = angleStop;
		});

		_editorButtons.Add(interpolationButton);

		buttonStyle = new ForgeButtonStyle("Easy Controls", btnUp, btnUp, null, 150);

		EasyControlsButton easyControlsButton = new EasyControlsButton(buttonStyle);
		easyControlsButton.Initialize(Target.lerpPosition,
			Target.serializePosition,
			Target.lerpRotation, 
			Target.serializeRotation,
			Target.lerpScale,
			Target.serializeScale,
		(lerpPositionChanged) =>
		{
			Target.lerpPosition = lerpPositionChanged;
		},
		(serializePositionChanged) =>
		{
			Target.serializePosition = serializePositionChanged;
		},
		(lerpRotationChanged) =>
		{
			Target.lerpRotation = lerpRotationChanged;
		},
		(serializeRotationChanged) =>
		{
			Target.serializeRotation = serializeRotationChanged;
		},
		(lerpScaleChanged) =>
		{
			Target.lerpScale = lerpScaleChanged;
		},
		(serializeScaleChanged) =>
		{
			Target.serializeScale = serializeScaleChanged;
		});

		_editorButtons.Add(easyControlsButton);

		buttonStyle = new ForgeButtonStyle("Miscellanous", btnUp, btnUp, null, 200);

		MiscellaneousButton miscButton = new MiscellaneousButton(buttonStyle);
		miscButton.Initialize("For things that constantly update like position and rotation you would normally not turn on reliable.",
			Target.isReliable,
			Target.isPlayer,
			Target.destroyOnDisconnect,
			Target.teleportToInitialPositions,
		(udpReliable)=>
		{
			Target.isReliable = udpReliable;
		},
		(isPlayer)=>
		{
			Target.isPlayer = isPlayer;
		},
		(destroyOnDisconnect)=>
		{
			Target.destroyOnDisconnect = destroyOnDisconnect;
		},
		(teleportToInitialPosition)=>
		{
			Target.teleportToInitialPositions = teleportToInitialPosition;
		});

		_editorButtons.Add(miscButton);

		//lerpFoldout.valueChanged.AddListener(Repaint);
		//networkingFoldout.valueChanged.AddListener(Repaint);
		//easyControls.valueChanged.AddListener(Repaint);
	}
    protected override void OnEnable()
    {
        base.OnEnable();

        //lerpFoldout = new AnimBool(true);
        //authoritativeFoldout = new AnimBool(true);
        networkingFoldout   = new AnimBool(false);
        easyControls        = new AnimBool(true);
        easyControls.target = true;

        _editorStyle = new GUIStyle();
        _editorStyle.normal.textColor = Color.white;
        _editorStyle.fontStyle        = FontStyle.Bold;
        _editorStyle.alignment        = TextAnchor.UpperCenter;

        Texture2D btnUp = Resources.Load <Texture2D>("HoverIdle");

        // TODO:  Implement
        //Texture2D btnDwn = Resources.Load<Texture2D>("HoverOver");
        //Texture2D btnIcon = Resources.Load<Texture2D>("ForgeAnvil");

        _editorButtons = new List <ForgeEditorDisplayButton>();

        ForgeButtonStyle buttonStyle = new ForgeButtonStyle("Server Is Authority", btnUp, btnUp, null, 75);
        //ForgeSubmitButtonStyle submitButtonStyle = new ForgeSubmitButtonStyle(() =>
        //{
        //	Debug.Log("Submit success");
        //}, "Toggle");

        ServerAuthorityButton serverAuthorityButton = new ServerAuthorityButton(buttonStyle);

        serverAuthorityButton.Initialize(Target.serverIsAuthority, Target.clientSidePrediction, string.Empty,
                                         (authorityValue) =>
        {
            Target.serverIsAuthority = authorityValue;
        },
                                         (clientSidePredictionValue) =>
        {
            Target.clientSidePrediction = clientSidePredictionValue;
        });

        _editorButtons.Add(serverAuthorityButton);

        buttonStyle = new ForgeButtonStyle("Networking Throttle", btnUp, btnUp, null, 100);

        NetworkThrottleButton networkingThrottleButton = new NetworkThrottleButton(buttonStyle);

        networkingThrottleButton.Initialize(Target.networkTimeDelay, "This controls how long (in seconds) to wait before updating across the network (priority can be emulated here), this includes [NetSync] vars.",
                                            (throttle) =>
        {
            Target.networkTimeDelay = throttle;
        });

        _editorButtons.Add(networkingThrottleButton);

        buttonStyle = new ForgeButtonStyle("Interpolation", btnUp, btnUp, null, 175);

        InterpolationButton interpolationButton = new InterpolationButton(buttonStyle);

        interpolationButton.Initialize(Target.interpolateFloatingValues, Target.lerpT, Target.lerpStopOffset, Target.lerpAngleStopOffset, "",
                                       (interpolation) =>
        {
            Target.interpolateFloatingValues = interpolation;
        },
                                       (lerpSpeed) =>
        {
            Target.lerpT = lerpSpeed;
        },
                                       (distanceStop) =>
        {
            Target.lerpStopOffset = distanceStop;
        },
                                       (angleStop) =>
        {
            Target.lerpAngleStopOffset = angleStop;
        });

        _editorButtons.Add(interpolationButton);

        buttonStyle = new ForgeButtonStyle("Easy Controls", btnUp, btnUp, null, 150);

        EasyControlsButton easyControlsButton = new EasyControlsButton(buttonStyle);

        easyControlsButton.Initialize(Target.lerpPosition,
                                      Target.serializePosition,
                                      Target.lerpRotation,
                                      Target.serializeRotation,
                                      Target.lerpScale,
                                      Target.serializeScale,
                                      (lerpPositionChanged) =>
        {
            Target.lerpPosition = lerpPositionChanged;
        },
                                      (serializePositionChanged) =>
        {
            Target.serializePosition = serializePositionChanged;
        },
                                      (lerpRotationChanged) =>
        {
            Target.lerpRotation = lerpRotationChanged;
        },
                                      (serializeRotationChanged) =>
        {
            Target.serializeRotation = serializeRotationChanged;
        },
                                      (lerpScaleChanged) =>
        {
            Target.lerpScale = lerpScaleChanged;
        },
                                      (serializeScaleChanged) =>
        {
            Target.serializeScale = serializeScaleChanged;
        }, 0, 0, 0);

        _editorButtons.Add(easyControlsButton);

        buttonStyle = new ForgeButtonStyle("Miscellaneous", btnUp, btnUp, null, 200);

        MiscellaneousButton miscButton = new MiscellaneousButton(buttonStyle);

        miscButton.Initialize("For things that constantly update like position and rotation you would normally not turn on reliable.",
                              Target.isReliable,
                              Target.isPlayer,
                              Target.destroyOnDisconnect,
                              Target.teleportToInitialPositions,
                              (udpReliable) =>
        {
            Target.isReliable = udpReliable;
        },
                              (isPlayer) =>
        {
            Target.isPlayer = isPlayer;
        },
                              (destroyOnDisconnect) =>
        {
            Target.destroyOnDisconnect = destroyOnDisconnect;
        },
                              (teleportToInitialPosition) =>
        {
            Target.teleportToInitialPositions = teleportToInitialPosition;
        });

        _editorButtons.Add(miscButton);

        //lerpFoldout.valueChanged.AddListener(Repaint);
        //networkingFoldout.valueChanged.AddListener(Repaint);
        //easyControls.valueChanged.AddListener(Repaint);
    }