From 32d0686cd28caf1653e74e4d33ca1729412cec4c Mon Sep 17 00:00:00 2001 From: henrisel Date: Sat, 7 Feb 2026 12:54:27 +0200 Subject: [PATCH] npcs turn smoothly towards player --- 3d-generation-pipeline/README.md | 2 -- .../ModeGeneration/NPCs/NPCController.cs | 24 +++++++++++++------ ProjectSettings/ProjectSettings.asset | 4 ++-- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/3d-generation-pipeline/README.md b/3d-generation-pipeline/README.md index 68352287..7154c6a1 100644 --- a/3d-generation-pipeline/README.md +++ b/3d-generation-pipeline/README.md @@ -11,9 +11,7 @@ * robert on plekiline, vunts õiget värvi :) * quest marker järjest järgmise tegevuse kohal: mikrofon, siis nupud * character billboard: - * tulnukale korraliku resolutsiooniga suu / silm liikuma * klaas on näha temast eespool - * pööramine kaamera poole - sujuvalt (slerp) Can't/Won't Do: * glTF loading: vahetada ära shader Universal render pipelin Lit, mitte panna buildi kaasa glTf oma - **ei saa, objekt on siis ilma tekstuurita, lihtsalt hall** diff --git a/Assets/_PROJECT/Scripts/ModeGeneration/NPCs/NPCController.cs b/Assets/_PROJECT/Scripts/ModeGeneration/NPCs/NPCController.cs index 86f798a8..2e61ba0a 100644 --- a/Assets/_PROJECT/Scripts/ModeGeneration/NPCs/NPCController.cs +++ b/Assets/_PROJECT/Scripts/ModeGeneration/NPCs/NPCController.cs @@ -5,17 +5,15 @@ using UnityEngine; public abstract class NPCController : MonoBehaviour { - protected Transform playerTransform; + [Header("Movement Config")] + public Transform mouth; + public float turnSpeed = 5f; [Header("Voiceline Amplitude Timeline Config")] public string voicelinesFolder = "CharacterVoicelines"; public string characterSpecificFolder; public string[] voiceLineKeys; - - [Header("Mouth Transform")] - public Transform mouth; // assign your billboard mouth object - [Header("Mouth Animation Settings")] public float minScaleY = 0.3f; public float maxScaleY = 1.0f; @@ -24,6 +22,8 @@ public abstract class NPCController : MonoBehaviour public float release = 0.2f; // slower closing public bool inverted = false; + protected Transform playerTransform; + private float[] rmsCurve; private EventInstance currentVoicelineEvent; private bool isSpeaking; @@ -50,9 +50,19 @@ public abstract class NPCController : MonoBehaviour { if (playerTransform != null) { - // As if player is on same Y coordinate as this object, to not rotate around Y axis. + // Keep target on same Y as this object (no pitch/roll), so we only yaw. Vector3 lookTargetPos = new Vector3(playerTransform.position.x, transform.position.y, playerTransform.position.z); - transform.LookAt(lookTargetPos); + + // Direction from this object to the target (on horizontal plane) + Vector3 toTarget = (lookTargetPos - transform.position); + if (toTarget.sqrMagnitude > 0.0001f) // avoid zero-length + { + Quaternion targetRot = Quaternion.LookRotation(toTarget.normalized); + + // Interpolate a little each frame towards the target rotation. + float t = Mathf.Clamp01(Time.deltaTime * turnSpeed); + transform.rotation = Quaternion.Lerp(transform.rotation, targetRot, t); + } } if (isSpeaking && rmsCurve != null && currentVoicelineEvent.isValid()) diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index 982ff64b..558f4158 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:69667d5279fb448c3347888d340da965b1e2acd14f1bef8f84a74d290ff6970f -size 26836 +oid sha256:7d0812577ef673b87b04aba8d878bfe8a84068278b9368bcbe0700a93d87ad50 +size 26527