Last active
April 30, 2020 23:47
-
-
Save CRodriguez25/79874ba46c000bb6b191a3f3c3d26e3f to your computer and use it in GitHub Desktop.
Add this script to any UI Element you want to dynamically show or hide (with animation), and set "Open" to true or false show/hide dynamically. Works with ScreenSpace.Overlay and ScreenSpace.Camera UI Canvases
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using UnityEngine; | |
public enum ToggleType | |
{ | |
Vertical, | |
Horizontal | |
} | |
public class UIPanelToggler: MonoBehaviour | |
{ | |
public bool Open = false; | |
public float ToggleSpeed = 20; | |
public ToggleType ToggleType = ToggleType.Horizontal; | |
private Transform _camera; | |
private Vector3 _startingScale; | |
private Vector3 _offScreenPosition = new Vector3(-10000, -10000, -10000); | |
public void Start() | |
{ | |
_camera = GameObject.FindGameObjectWithTag("MainCamera").transform; | |
_startingScale = gameObject.transform.localScale; | |
if (Open) | |
{ | |
gameObject.transform.position = _camera.transform.position; | |
} | |
else | |
{ | |
Vector3 newScale; | |
if (ToggleType == ToggleType.Vertical) | |
{ | |
newScale = new Vector3( | |
gameObject.transform.localScale.x, | |
0.01f, | |
gameObject.transform.localScale.z | |
); | |
} | |
else | |
{ | |
newScale = new Vector3( | |
0.01f, | |
gameObject.transform.localScale.y, | |
gameObject.transform.localScale.z | |
); | |
} | |
gameObject.transform.localScale = newScale; | |
gameObject.transform.position = _offScreenPosition; | |
} | |
} | |
void Update() | |
{ | |
if (!Open) | |
ClosePanel(); | |
else if (Open) | |
OpenPanel(); | |
} | |
private void OpenPanel() | |
{ | |
gameObject.transform.localPosition = new Vector3(0, 0, 0); | |
if (ToggleType == ToggleType.Vertical && gameObject.transform.localScale.y == _startingScale.y) return; | |
if (ToggleType == ToggleType.Horizontal && gameObject.transform.localScale.x == _startingScale.x) return; | |
var target = ToggleType == ToggleType.Vertical ? _startingScale.y : _startingScale.x; | |
gameObject.transform.localScale = GenerateIntermediateScaleVector(target); | |
} | |
private void ClosePanel() | |
{ | |
if (gameObject.transform.localPosition == _offScreenPosition) | |
return; | |
var newScale = GenerateIntermediateScaleVector(0); | |
if (newScale.y <= 0.01 || newScale.x < 0.01) | |
{ | |
gameObject.transform.position = _offScreenPosition; | |
} | |
else | |
{ | |
gameObject.transform.localScale = newScale; | |
} | |
} | |
private Vector3 GenerateIntermediateScaleVector(float target) | |
{ | |
Vector3 newScale; | |
if (ToggleType == ToggleType.Vertical) | |
{ | |
newScale = new Vector3( | |
gameObject.transform.localScale.x, | |
Mathf.Lerp(gameObject.transform.localScale.y, target, ToggleSpeed * Time.deltaTime), | |
gameObject.transform.localScale.z | |
); | |
} | |
else | |
{ | |
newScale = new Vector3( | |
Mathf.Lerp(gameObject.transform.localScale.x, target, ToggleSpeed * Time.deltaTime), | |
gameObject.transform.localScale.y, | |
gameObject.transform.localScale.z | |
); | |
} | |
return newScale; | |
} | |
} | |
// Example Usage: GetComponent<UIPanelToggler>().Open = true; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment