79 lines
2.8 KiB
C#
79 lines
2.8 KiB
C#
using UnityEngine;
|
|
|
|
public class MataMelirik : MonoBehaviour
|
|
{
|
|
public Transform mataKiri;
|
|
public Transform mataKanan;
|
|
|
|
[Header("Pengaturan")]
|
|
public float radiusLirik = 20f; // Seberapa jauh bola mata bisa geser (dalam pixel/unit)
|
|
public float kecepatanLirik = 5f; // Kelenturan gerakan mata
|
|
|
|
private Vector3 posisiAwalKiri;
|
|
private Vector3 posisiAwalKanan;
|
|
|
|
void Start()
|
|
{
|
|
// Simpan posisi tengah mata biar tahu jalan pulang
|
|
posisiAwalKiri = mataKiri.localPosition;
|
|
posisiAwalKanan = mataKanan.localPosition;
|
|
}
|
|
|
|
void Update()
|
|
{
|
|
// 1. Cari objek terdekat yang jatuh (bisa Sayur atau JunkFood)
|
|
GameObject target = CariObjekTerdekat();
|
|
|
|
if (target != null)
|
|
{
|
|
// 2. Hitung arah dari mata ke sayur
|
|
LirikKe(mataKiri, posisiAwalKiri, target.transform.position);
|
|
LirikKe(mataKanan, posisiAwalKanan, target.transform.position);
|
|
}
|
|
else
|
|
{
|
|
// 3. Kalau nggak ada yang jatuh, mata balik ke tengah (tampang polos)
|
|
mataKiri.localPosition = Vector3.Lerp(mataKiri.localPosition, posisiAwalKiri, kecepatanLirik * Time.deltaTime);
|
|
mataKanan.localPosition = Vector3.Lerp(mataKanan.localPosition, posisiAwalKanan, kecepatanLirik * Time.deltaTime);
|
|
}
|
|
}
|
|
|
|
void LirikKe(Transform mata, Vector3 posisiAsal, Vector3 targetPos)
|
|
{
|
|
// Hitung arah ke target
|
|
Vector3 arah = targetPos - mata.position;
|
|
|
|
// Batasi jarak geser mata agar tidak keluar dari kelopak mata
|
|
Vector3 lirikPos = arah.normalized * radiusLirik;
|
|
|
|
// Gabungkan posisi awal dengan pergeseran (offset)
|
|
Vector3 hasilPos = posisiAsal + lirikPos;
|
|
|
|
// Gerakkan mata secara halus
|
|
mata.localPosition = Vector3.Lerp(mata.localPosition, hasilPos, kecepatanLirik * Time.deltaTime);
|
|
}
|
|
|
|
GameObject CariObjekTerdekat()
|
|
{
|
|
// Gabungkan pengecekan Sayur dan JunkFood
|
|
GameObject[] sayurs = GameObject.FindGameObjectsWithTag("Sayur");
|
|
GameObject[] junks = GameObject.FindGameObjectsWithTag("JunkFood");
|
|
|
|
GameObject terdekat = null;
|
|
float jarakTerpendek = Mathf.Infinity;
|
|
Vector3 posisiDino = transform.position;
|
|
|
|
// Cek Sayur
|
|
foreach (GameObject s in sayurs) {
|
|
float jarak = Vector3.Distance(posisiDino, s.transform.position);
|
|
if (jarak < jarakTerpendek) { jarakTerpendek = jarak; terdekat = s; }
|
|
}
|
|
// Cek JunkFood
|
|
foreach (GameObject j in junks) {
|
|
float jarak = Vector3.Distance(posisiDino, j.transform.position);
|
|
if (jarak < jarakTerpendek) { jarakTerpendek = jarak; terdekat = j; }
|
|
}
|
|
|
|
return terdekat;
|
|
}
|
|
} |