Aetheria/Assets/Scripts/UI/HUD/PlaceUIElementWorldspace.cs
Reinier Vens 81acaf2a47 In Game Input Screen
Implemented saving/loading of custom input settings
Incorporated Input Screen in game
Organized UI scripts into folders
Deleted some unused UI scripts
Reimplemented Fog Blur (by copying modified DoF to assets)
2021-05-08 07:35:16 +01:00

71 lines
No EOL
2.5 KiB
C#

using UnityEngine;
using Unity.Mathematics;
using static Unity.Mathematics.math;
using static Unity.Mathematics.noise;
using static Noise1D;
/// <summary>
/// Place an UI element to a world position
/// </summary>
[RequireComponent(typeof(RectTransform))]
public class PlaceUIElementWorldspace : MonoBehaviour
{
public float NoiseAmplitude;
public float NoiseFrequency;
public Canvas Canvas;
public float BorderPixels = 10;
public bool PointAtTarget;
public Vector2 ScreenSpaceOffset;
public float EdgeMargin = .1f;
public Vector3 Target;
private RectTransform _rectTransform;
private Transform _cameraTransform;
private float _noiseOffset;
private RectTransform _canvasRectTransform;
private Camera _mainCamera;
private Quaternion _startRotation;
void Start()
{
// Get the rect transform
_rectTransform = GetComponent<RectTransform>();
_cameraTransform = Camera.main.transform;
_canvasRectTransform = Canvas.GetComponent<RectTransform>();
_mainCamera = Camera.main;
_startRotation = transform.rotation;
}
private void OnEnable()
{
_noiseOffset = UnityEngine.Random.Range(-100f, 100f);
}
/// <summary>
/// Move the UI element to the world position
/// </summary>
void LateUpdate()
{
_noiseOffset += Time.deltaTime * NoiseFrequency;
Vector2 screenPoint = RectTransformUtility.WorldToScreenPoint(_mainCamera, Target);
var toTarget = (Target - _mainCamera.transform.position).normalized;
screenPoint *= Mathf.Sign(Vector3.Dot(_cameraTransform.forward, Target - _cameraTransform.position));
screenPoint += new Vector2(noise(_noiseOffset), noise(10 + _noiseOffset)) * NoiseAmplitude;
var clampedPoint = new Vector2(
Mathf.Clamp(screenPoint.x, BorderPixels, Screen.width - BorderPixels),
Mathf.Clamp(screenPoint.y, BorderPixels, Screen.height - BorderPixels));
var toEdge = _mainCamera.ScreenPointToRay(clampedPoint);
var edgeLerp = smoothstep(1 - EdgeMargin, 1, dot(toEdge.direction, toTarget));
if (PointAtTarget)
{
transform.rotation = Quaternion.Slerp(
Quaternion.LookRotation(Vector3.forward, (screenPoint - clampedPoint).normalized),
_startRotation, edgeLerp);
}
clampedPoint += ScreenSpaceOffset * edgeLerp;
_rectTransform.anchoredPosition = clampedPoint / Canvas.scaleFactor - _canvasRectTransform.sizeDelta / 2f;
}
}