# Eyes
==From== [[DESIGNS/ToyWorldsAtlas/AtlasD_Doc|AtlasD_Doc]]
*Reference*:
- Reference: https://chrisakroyd.com/snippets/eyes/
- Code ref: https://qookie.games/eye-tracking/?utm_source=chatgpt.com
### Follow and Spin
```cs
using UnityEngine;
public class DPupil : MonoBehaviour
{
public float maxDistance = 0.1f;
public float speed = 10f;
public float spinSpeed = 360f;
private bool spinning;
private Transform pupilPos;
private Camera mainCam;
private Vector3 eyeCenter;
void Start()
{
pupilPos = gameObject.transform;
mainCam = Camera.main;
eyeCenter = pupilPos.localPosition;
}
void Update()
{
if (!spinning)
TrackMouse();
}
void TrackMouse()
{
Vector3 mousePos = Input.mousePosition;
Vector3 worldPoint = mainCam.ScreenToWorldPoint(new Vector3(mousePos.x, mousePos.y, 0));
Vector3 localMousePos = transform.InverseTransformPoint(worldPoint);
Vector3 pupilDirection = localMousePos - eyeCenter;
// To constrain the pupil within the eye
if (pupilDirection.magnitude > maxDistance)
pupilDirection = pupilDirection.normalized * maxDistance;
Vector3 targetPos = eyeCenter + pupilDirection;
// To smoothen the pupil's movement:
pupilPos.localPosition = Vector3.Lerp(pupilPos.localPosition, targetPos, speed * Time.deltaTime);
}
// For victory animation
public void SpinPupil()
{
if (!spinning)
{
StartCoroutine(SpinCoroutine());
}
}
private System.Collections.IEnumerator SpinCoroutine()
{
spinning = true;
float duration = 2.5f;
float elapsed = 0f;
int direction = Random.Range(0, 2) == 0 ? -1 : 1; // -1 = против часовой, 1 = по часовой
while (elapsed < duration)
{
transform.Rotate(Vector3.forward, direction * spinSpeed * Time.deltaTime);
elapsed += Time.deltaTime;
yield return null;
}
spinning = false;
}
}
```