From e4d61a6648ebbd9541d51163a40f14551ce26142 Mon Sep 17 00:00:00 2001 From: henrisel Date: Tue, 6 Jan 2026 18:43:59 +0200 Subject: [PATCH] make sprite NPC look at player --- .../{SpriteNPC.prefab => BillboardNPC.prefab} | 268 +++++++++--------- ...C.prefab.meta => BillboardNPC.prefab.meta} | 2 +- .../_PROJECT/Scenes/DeltaBuilding_base.unity | 4 +- Assets/_PROJECT/Scripts/NPCController.cs | 41 ++- 4 files changed, 169 insertions(+), 146 deletions(-) rename Assets/_PROJECT/Prefabs/Characters/{SpriteNPC.prefab => BillboardNPC.prefab} (71%) rename Assets/_PROJECT/Prefabs/Characters/{SpriteNPC.prefab.meta => BillboardNPC.prefab.meta} (74%) diff --git a/Assets/_PROJECT/Prefabs/Characters/SpriteNPC.prefab b/Assets/_PROJECT/Prefabs/Characters/BillboardNPC.prefab similarity index 71% rename from Assets/_PROJECT/Prefabs/Characters/SpriteNPC.prefab rename to Assets/_PROJECT/Prefabs/Characters/BillboardNPC.prefab index 966b3c9a..a716afd9 100644 --- a/Assets/_PROJECT/Prefabs/Characters/SpriteNPC.prefab +++ b/Assets/_PROJECT/Prefabs/Characters/BillboardNPC.prefab @@ -1,6 +1,6 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: ---- !u!1 &1348576862213168825 +--- !u!1 &1758614216652057599 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -8,129 +8,52 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 5793485888200432495} - - component: {fileID: 5576627741215249340} - - component: {fileID: 7894579972138815280} + - component: {fileID: 6822286665445551211} + - component: {fileID: 7293572772725810188} + - component: {fileID: 3429438874807908211} m_Layer: 0 - m_Name: Mouth + m_Name: MainImage m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &5793485888200432495 +--- !u!224 &6822286665445551211 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1348576862213168825} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: -0} - m_LocalScale: {x: 4.2348323, y: 4.2348323, z: 4.2348323} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 5325272275925428740} - m_RootOrder: -1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0.5} - m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 82, y: -129} - m_SizeDelta: {x: 100, y: 100} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &5576627741215249340 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1348576862213168825} - m_CullTransparentMesh: 1 ---- !u!114 &7894579972138815280 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1348576862213168825} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 21300000, guid: 4e1109ed0698828469be212e037d25a8, type: 3} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!1 &1871742264404547957 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 5325272275925428740} - - component: {fileID: 2321102460832317517} - - component: {fileID: 6004572949301945410} - - component: {fileID: 2682629068039722448} - m_Layer: 0 - m_Name: NPC - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &5325272275925428740 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1871742264404547957} + m_GameObject: {fileID: 1758614216652057599} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} + m_LocalScale: {x: 0.001, y: 0.001, z: 0.001} m_ConstrainProportionsScale: 1 m_Children: - - {fileID: 5793485888200432495} - m_Father: {fileID: 8708476114070916424} + - {fileID: 5759406807219530703} + m_Father: {fileID: 5657737279223690836} m_RootOrder: -1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 1255, y: 2048} + m_SizeDelta: {x: 1224, y: 2048} m_Pivot: {x: 0.5, y: 0.5} ---- !u!222 &2321102460832317517 +--- !u!222 &7293572772725810188 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1871742264404547957} + m_GameObject: {fileID: 1758614216652057599} m_CullTransparentMesh: 1 ---- !u!114 &6004572949301945410 +--- !u!114 &3429438874807908211 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1871742264404547957} + m_GameObject: {fileID: 1758614216652057599} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} @@ -154,22 +77,7 @@ MonoBehaviour: m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 ---- !u!114 &2682629068039722448 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1871742264404547957} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: baa11cfc03dc213438961722257e2e94, type: 3} - m_Name: - m_EditorClassIdentifier: - mouthTransform: {fileID: 5793485888200432495} - mouthScalingMultiplier: 2.5 - mouthMovementDuration: 0.25 ---- !u!1 &2530116071908016359 +--- !u!1 &4663194936290788516 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -177,31 +85,33 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 8708476114070916424} - - component: {fileID: 7828152921891630034} - - component: {fileID: 3653681783058805162} - - component: {fileID: 4797389956015260388} + - component: {fileID: 5657737279223690836} + - component: {fileID: 629815897227783454} + - component: {fileID: 584286906844083765} + - component: {fileID: 6105090838799004608} + - component: {fileID: 6238040606326453210} + - component: {fileID: 1155083335105893391} m_Layer: 0 - m_Name: Canvas + m_Name: BillboardNPC m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!224 &8708476114070916424 +--- !u!224 &5657737279223690836 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2530116071908016359} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_GameObject: {fileID: 4663194936290788516} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0.001, y: 0.001, z: 0.001} + m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 5325272275925428740} - m_Father: {fileID: 2332358709579249609} + - {fileID: 6822286665445551211} + m_Father: {fileID: 0} m_RootOrder: -1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} @@ -209,13 +119,13 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 250, y: 250} m_Pivot: {x: 0.5, y: 0.5} ---- !u!223 &7828152921891630034 +--- !u!223 &629815897227783454 Canvas: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2530116071908016359} + m_GameObject: {fileID: 4663194936290788516} m_Enabled: 1 serializedVersion: 3 m_RenderMode: 2 @@ -231,13 +141,13 @@ Canvas: m_SortingLayerID: 0 m_SortingOrder: 0 m_TargetDisplay: 0 ---- !u!114 &3653681783058805162 +--- !u!114 &584286906844083765 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2530116071908016359} + m_GameObject: {fileID: 4663194936290788516} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} @@ -253,14 +163,14 @@ MonoBehaviour: m_FallbackScreenDPI: 96 m_DefaultSpriteDPI: 96 m_DynamicPixelsPerUnit: 1 - m_PresetInfoIsWorld: 1 ---- !u!114 &4797389956015260388 + m_PresetInfoIsWorld: 0 +--- !u!114 &6105090838799004608 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2530116071908016359} + m_GameObject: {fileID: 4663194936290788516} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} @@ -271,7 +181,43 @@ MonoBehaviour: m_BlockingMask: serializedVersion: 2 m_Bits: 4294967295 ---- !u!1 &7905360453557577391 +--- !u!114 &6238040606326453210 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4663194936290788516} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: baa11cfc03dc213438961722257e2e94, type: 3} + m_Name: + m_EditorClassIdentifier: + mouthTransform: {fileID: 5759406807219530703} + mouthScalingMultiplier: 2.5 + mouthMovementDuration: 0.25 +--- !u!135 &1155083335105893391 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4663194936290788516} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 1 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Radius: 5 + m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &7802421088258943189 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -279,27 +225,71 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 2332358709579249609} + - component: {fileID: 5759406807219530703} + - component: {fileID: 7165916293981694318} + - component: {fileID: 6022352331462232051} m_Layer: 0 - m_Name: SpriteNPC + m_Name: Mouth m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &2332358709579249609 -Transform: +--- !u!224 &5759406807219530703 +RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7905360453557577391} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} + m_GameObject: {fileID: 7802421088258943189} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -0} + m_LocalScale: {x: 4.2348323, y: 4.2348323, z: 4.2348323} m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 8708476114070916424} - m_Father: {fileID: 0} - m_RootOrder: 0 + m_Children: [] + m_Father: {fileID: 6822286665445551211} + m_RootOrder: -1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 82, y: -129} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7165916293981694318 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7802421088258943189} + m_CullTransparentMesh: 1 +--- !u!114 &6022352331462232051 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7802421088258943189} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 21300000, guid: 4e1109ed0698828469be212e037d25a8, type: 3} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 diff --git a/Assets/_PROJECT/Prefabs/Characters/SpriteNPC.prefab.meta b/Assets/_PROJECT/Prefabs/Characters/BillboardNPC.prefab.meta similarity index 74% rename from Assets/_PROJECT/Prefabs/Characters/SpriteNPC.prefab.meta rename to Assets/_PROJECT/Prefabs/Characters/BillboardNPC.prefab.meta index a9bb0503..cdc05b85 100644 --- a/Assets/_PROJECT/Prefabs/Characters/SpriteNPC.prefab.meta +++ b/Assets/_PROJECT/Prefabs/Characters/BillboardNPC.prefab.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 35fb8eb96688c454a8a1b9be088e5454 +guid: a4870b318dece4e4fb86232bcbe55386 PrefabImporter: externalObjects: {} userData: diff --git a/Assets/_PROJECT/Scenes/DeltaBuilding_base.unity b/Assets/_PROJECT/Scenes/DeltaBuilding_base.unity index 09d93be0..3b12abe3 100644 --- a/Assets/_PROJECT/Scenes/DeltaBuilding_base.unity +++ b/Assets/_PROJECT/Scenes/DeltaBuilding_base.unity @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4834233c9b83183144f941f43f4915e70e705a0157f06d40bdfb55cabf1820d3 -size 67039265 +oid sha256:1dc1041a15e19c0ca7bf06cd9fd60cb0404da5d5cce38f5ae5a3db32d0ab0d0c +size 67042723 diff --git a/Assets/_PROJECT/Scripts/NPCController.cs b/Assets/_PROJECT/Scripts/NPCController.cs index 00b9a656..f08868e3 100644 --- a/Assets/_PROJECT/Scripts/NPCController.cs +++ b/Assets/_PROJECT/Scripts/NPCController.cs @@ -1,13 +1,13 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; using DG.Tweening; +using Unity.XR.CoreUtils; +using UnityEngine; public class NPCController : MonoBehaviour { private Vector3 mouthClosedScale; private Vector3 mouthOpenScale; private bool isTalking; + private Transform playerTransform; public Transform mouthTransform; public float mouthScalingMultiplier = 2.5f; @@ -25,7 +25,40 @@ public class NPCController : MonoBehaviour // Update is called once per frame void Update() { - + if (playerTransform != null) + { + // As if player is on same Y coordinate as this object, to not rotate around Y axis. + Vector3 lookTargetPos = new Vector3(playerTransform.position.x, transform.position.y, playerTransform.position.z); + transform.LookAt(lookTargetPos); + } + } + + private void OnTriggerEnter(Collider other) + { + Debug.Log("Collided with " + other); + KbmController controller = other.GetComponent(); + XROrigin playerOrigin = other.GetComponent(); + if (controller != null) + { + playerTransform = controller.transform; + } else if (playerOrigin != null) + { + playerTransform = playerOrigin.transform; + } + } + + private void OnTriggerExit(Collider other) + { + KbmController controller = other.GetComponent(); + XROrigin playerOrigin = other.GetComponent(); + if (controller != null) + { + playerTransform = null; + } + else if (playerOrigin != null) + { + playerTransform = null; + } } public void StartTalking()