I noticed a few game didn't have a pause menu so I feel like this might be useful some later down the line. Even if this is outside of your normal engine I hope that my code can inspire other's solutions that may even help debug a problem they may have. Feel free to modify this code as you see fit, I can always rewrite or refactor any of this as needed!
Menu Transition Code: This is the code I used in Unity3D to make the menu seamlessly switch between each other.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Menutransition : MonoBehaviour
{
public GameObject _StartingScreen;
public GameObject _TargetScreen;
public Animator _ScreenAnimator;
public float _TimeDelay;
public void Transitioning()
{
StartCoroutine(SwitchingScreens());
}
IEnumerator SwitchingScreens()
{
_ScreenAnimator.Play("Swipe");
yield return new WaitForSecondsRealtime(_TimeDelay);
_TargetScreen.SetActive(true);
_StartingScreen.SetActive(false);
}
}
Floating Object
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Floating_object : MonoBehaviour
{
Vector3 startPos;
// the height that the object will float above and back down from
public float amplitude = 10f;
// the time that the object will take to float to the height
public float period = 5f;
protected void Start()
{
startPos = transform.position;
}
protected void Update()
{
float theta = Time.timeSinceLevelLoad / period;
float distance = amplitude * Mathf.Sin(theta);
transform.position = startPos + Vector3.up * distance;
}
}
Heal or Damage: I mixed these two together so that I wouldn't need to make a bunch of scripts while still keeping things optimized. Simply by toggling the bool, this can either damage or heal the player. It's pretty useful especially if you have a game object that can heal and damage.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class HealorDamage : MonoBehaviour
{
public bool _Healer;
public GameObject _Target;
public float _HealthPoints;
public SphereCollider _SelfCollider;
public float _Cooldown;
private void Start()
{
_SelfCollider = this.gameObject.GetComponent<SphereCollider>();
}
private void OnTriggerEnter(Collider other)
{
if (other.gameObject.CompareTag("Player") || (other.gameObject.CompareTag("Enemy")))
{
_Target = other.gameObject;
if (_Healer == true)
{
Healing();
}
else
{
Damaging();
}
}
}
void Healing()
{
if (_Target.GetComponent<CharacterHealth>()._HealthCurrent < 50)
{
_Target.GetComponent<CharacterHealth>().GainHealth(_HealthPoints);
print("Have some HP!");
}
else
{
print("You're already at max health!");
StartCoroutine(ColliderToggle());
return;
}
}
void Damaging()
{
if (_Target.GetComponent<CharacterHealth>()._HealthCurrent > 0)
{
_Target.GetComponent<CharacterHealth>().TakeDamage(_HealthPoints);
print("Give me that HP!");
}
else
{
print("You're suppose to be dead!");
StartCoroutine(ColliderToggle());
return;
}
}
IEnumerator ColliderToggle()
{
_SelfCollider.enabled = false;
print("collider off");
yield return new WaitForSeconds(_Cooldown);
_SelfCollider.enabled = true;
print("collider on");
}
}
Character Health: This one is similar to the HealorDamage in how it can be used on both a player and an enemy as long as a bool is checked off. The logic for the health lives and energy do the same thing but they do require images to display the info.
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using TMPro;
using UnityEngine;
public class CharacterHealth : MonoBehaviour
{
[Header("Health")]
public float _HealthMax;
public float _HealthCurrent;
public Image _HealthBarSource;
[Header("Energy")]
public float _EnergyMax;
public float _EnergyCurrent;
public Image _EnergyRingSource;
[Header("Lives")]
public int _LivesMax;
public int _LivesCurrent;
public TMP_Text _LivesSource;
public GameObject _Explosion;
public bool _IsEnemy;
public void Start()
{
_HealthCurrent = _HealthMax;
_EnergyCurrent = _EnergyMax;
_LivesCurrent = _LivesMax;
if (_IsEnemy == false)
{
LinkUI();
}
else
{
ClearUI();
}
}
public void Update()
{
Death();
if (_IsEnemy == false)
{
_HealthBarSource.fillAmount = (_HealthCurrent * 0.02f);
_EnergyRingSource.fillAmount = (_EnergyCurrent * 0.04f);
}
}
private void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Death"))
{
gameObject.transform.position = new Vector3(0, 0, 0);
Instantiate(_Explosion, gameObject.transform.position, gameObject.transform.rotation);
}
}
void LinkUI()
{
_HealthBarSource.GetComponent<Image>();
_EnergyRingSource.GetComponent<Image>();
}
void ClearUI()
{
_HealthBarSource = null;
_EnergyRingSource = null;
_LivesSource = null;
}
public void GainHealth(float _Hp)
{
_HealthCurrent += _Hp;
print("Player has been healed");
}
public void TakeDamage(float _Hp)
{
_HealthCurrent -= _Hp;
print("Player has been harmed");
}
void Death()
{
if (_HealthCurrent <= 0 && _IsEnemy)
{
Instantiate(_Explosion, gameObject.transform.position, gameObject.transform.rotation);
Destroy(gameObject);
print(gameObject + " has died");
}
if (_HealthCurrent <= 0 && !_IsEnemy)
{
print("Restart the damn game!");
}
}
}