using DG.Tweening; using UnityEngine; public class QuestMarker : MonoBehaviour { public Transform movingPart; public float amplitude = 0.1f; // How far up/down it moves public float frequency = 1.5f; // Speed of oscillation public float heightAboveTarget = 0.75f; public float moveToTargetDuration = 2f; private Vector3 startPos; private Transform playerTransform; private Transform hoverAboveTransform; // Start is called before the first frame update void Start() { startPos = movingPart.localPosition; } // Update is called once per frame void Update() { // Float up and down float offset = Mathf.Sin(Time.time * frequency) * amplitude; movingPart.localPosition = startPos + new Vector3(0f, offset, 0f); if (playerTransform != null) { // Turn towards player Vector3 lookTargetPos = new Vector3(playerTransform.position.x, transform.position.y, playerTransform.position.z); transform.LookAt(lookTargetPos); } if (hoverAboveTransform != null) { transform.position = hoverAboveTransform.position + new Vector3(0f, heightAboveTarget, 0f); } } private void OnTriggerEnter(Collider other) { if (other.gameObject.tag == "Player Head") { playerTransform = other.transform; } } private void OnTriggerExit(Collider other) { if (other.gameObject.tag == "Player Head") { playerTransform = null; } } public void MoveTo(Transform target, bool attach = false) { hoverAboveTransform = null; transform.DOMove(target.position + new Vector3(0, heightAboveTarget, 0), moveToTargetDuration).OnComplete(() => { if (attach) { hoverAboveTransform = target; } }); } }