diff --git a/BlueWater/Assets/01.Scenes/02.Main.unity b/BlueWater/Assets/01.Scenes/02.Main.unity index c22e878d6..d1912626c 100644 --- a/BlueWater/Assets/01.Scenes/02.Main.unity +++ b/BlueWater/Assets/01.Scenes/02.Main.unity @@ -16358,7 +16358,7 @@ GameObject: m_Component: - component: {fileID: 483976618} m_Layer: 16 - m_Name: InteractionProps + m_Name: Props m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -40034,6 +40034,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 856aad87fa8b411f90b036b9c5e05378, type: 3} m_Name: m_EditorClassIdentifier: + k__BackingField: [] prisonPoint: {fileID: 0} --- !u!1001 &1254663816 PrefabInstance: diff --git a/BlueWater/Assets/02.Scripts/Character/Npc/Type/InShipNpc.cs b/BlueWater/Assets/02.Scripts/Character/Npc/Type/InShipNpc.cs index 3c8dd0c23..82fd9b087 100644 --- a/BlueWater/Assets/02.Scripts/Character/Npc/Type/InShipNpc.cs +++ b/BlueWater/Assets/02.Scripts/Character/Npc/Type/InShipNpc.cs @@ -65,7 +65,7 @@ namespace BlueWaterProject.Type } else if (stateMachine.CurrentState.GetType() != typeof(MotionSickState)) { - var motionSickState = new MotionSickState(); + var motionSickState = new MotionSickState(agent, InShipMapInfo); motionSickState.OnEnterAction += OnEnterAction; stateMachine.ChangeState(motionSickState); } @@ -81,7 +81,7 @@ namespace BlueWaterProject.Type private void InitNatureValue() { MotionSickValue = 0; - motionSickMaxValue = 300; + motionSickMaxValue = Random.Range(100, 1000); hungerValue = 0; hungerMaxValue = 100; diseaseValue = 0; diff --git a/BlueWater/Assets/02.Scripts/InShipMapInfo.cs b/BlueWater/Assets/02.Scripts/InShipMapInfo.cs index a2f8119e1..ec7537aa6 100644 --- a/BlueWater/Assets/02.Scripts/InShipMapInfo.cs +++ b/BlueWater/Assets/02.Scripts/InShipMapInfo.cs @@ -1,17 +1,21 @@ // ReSharper disable once CheckNamespace using System; +using System.Collections.Generic; using UnityEngine; +using UnityEngine.Serialization; namespace BlueWaterProject { public class InShipMapInfo : MonoBehaviour { + [field: SerializeField] public List Toilets { get; set; } private GameObject usablePrisonDoor; public Transform prisonPoint; private void Init() { + Toilets = new List(); usablePrisonDoor = GameObject.Find("UsablePrisonDoor"); prisonPoint = GameObject.Find("PrisonPoint").transform; } @@ -30,5 +34,10 @@ namespace BlueWaterProject { usablePrisonDoor.SetActive(true); } + + public void AddToilet(Toilet toilet) + { + Toilets.Add(toilet); + } } } \ No newline at end of file diff --git a/BlueWater/Assets/02.Scripts/Npc/MotionSickState.cs b/BlueWater/Assets/02.Scripts/Npc/MotionSickState.cs index 9510124b7..9060473f4 100644 --- a/BlueWater/Assets/02.Scripts/Npc/MotionSickState.cs +++ b/BlueWater/Assets/02.Scripts/Npc/MotionSickState.cs @@ -1,22 +1,80 @@ using System; +using System.Linq; using BlueWaterProject.Type; +using UnityEngine; +using UnityEngine.AI; namespace BlueWaterProject { public class MotionSickState : INpcState { public event Action OnEnterAction; + private NavMeshAgent agent; + private InShipMapInfo inShipMapInfo; + private bool isMovingToToilet; + private Toilet targetToilet; + + public MotionSickState(NavMeshAgent agent, InShipMapInfo inShipMapInfo) + { + this.agent = agent; + this.inShipMapInfo = inShipMapInfo; + } public void OnEnter(NpcStateMachine npcStateMachine) { - npcStateMachine.InstantiateObject(DataManager.Inst.vomit, npcStateMachine.transform.position); - OnEnterAction?.Invoke(); - npcStateMachine.RestorePreviousState(); + var toilets = inShipMapInfo.Toilets; + + // 화장실을 NPC와의 거리에 따라 정렬합니다. + var sortedToilets = toilets.OrderBy(toilet => Vector3.Distance(agent.transform.position, toilet.transform.position)).ToList(); + + Toilet availableToilet = null; + + foreach (var toilet in sortedToilets) + { + // 사용 가능한 화장실을 찾습니다. + if (!toilet.IsUsed) + { + availableToilet = toilet; + break; + } + } + + // 사용 가능한 화장실이 있는 경우 + if (availableToilet != null) + { + agent.SetDestination(availableToilet.transform.position); + agent.stoppingDistance = 0; + + isMovingToToilet = true; + targetToilet = availableToilet; + agent.SetDestination(availableToilet.transform.position); + agent.stoppingDistance = 0; + } + else + { + npcStateMachine.InstantiateObject(DataManager.Inst.vomit, npcStateMachine.transform.position); + OnEnterAction?.Invoke(); + npcStateMachine.RestorePreviousState(); + } } public void OnUpdate(NpcStateMachine npcStateMachine) { - + // 화장실로 이동 중이라면 + if (isMovingToToilet) + { + // 도착 여부 확인 + if (agent.remainingDistance <= agent.stoppingDistance && !agent.pathPending) + { + // 도착했다면 화장실 사용 + targetToilet.UseToilet(); + OnEnterAction?.Invoke(); + npcStateMachine.RestorePreviousState(); + + // 이동 상태 업데이트 + isMovingToToilet = false; + } + } } public void OnExit(NpcStateMachine npcStateMachine) diff --git a/BlueWater/Assets/02.Scripts/Props.meta b/BlueWater/Assets/02.Scripts/Props.meta new file mode 100644 index 000000000..c13cfd4f2 --- /dev/null +++ b/BlueWater/Assets/02.Scripts/Props.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 88c006e5da3dd43df840619fb049c72f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BlueWater/Assets/02.Scripts/Props/Toilet.cs b/BlueWater/Assets/02.Scripts/Props/Toilet.cs new file mode 100644 index 000000000..d9a37cf0b --- /dev/null +++ b/BlueWater/Assets/02.Scripts/Props/Toilet.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace BlueWaterProject +{ + public class Toilet : MonoBehaviour + { + [field: SerializeField] public bool IsUsed { get; set; } + [SerializeField] private int toiletGauge = 0; + private int toiletMaxGauge = 100; + + private InShipMapInfo inShipMapInfo; + + private void Awake() + { + inShipMapInfo = GameObject.Find("InShipMap").GetComponent(); + inShipMapInfo.AddToilet(this); + } + + public Transform UseToilet() + { + if (IsUsed) return null; + if (toiletGauge >= toiletMaxGauge) + { + ToiletFull(); + return null; + } + IsUsed = true; + StartCoroutine(ToiletGaugeUp()); + return transform; + } + + private void ToiletFull() + { + // 화장실이 꽉 찼을 때 이벤트 + } + + IEnumerator ToiletGaugeUp() + { + while (true) + { + yield return new WaitForSeconds(1f); + toiletGauge += 5; + IsUsed = false; + break; + } + } + + + } +} diff --git a/BlueWater/Assets/02.Scripts/Props/Toilet.cs.meta b/BlueWater/Assets/02.Scripts/Props/Toilet.cs.meta new file mode 100644 index 000000000..32651a2e8 --- /dev/null +++ b/BlueWater/Assets/02.Scripts/Props/Toilet.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a9e567bc086814a5c823025f50d68481 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BlueWater/Assets/05.Prefabs/Props/InShipProps/Vomit.prefab b/BlueWater/Assets/05.Prefabs/Props/InShipProps/Vomit.prefab index a9b953c7a..2424a540c 100644 --- a/BlueWater/Assets/05.Prefabs/Props/InShipProps/Vomit.prefab +++ b/BlueWater/Assets/05.Prefabs/Props/InShipProps/Vomit.prefab @@ -10,8 +10,10 @@ GameObject: m_Component: - component: {fileID: 4954690593422870212} - component: {fileID: 4075789757365797969} + - component: {fileID: 2605975875765928815} + - component: {fileID: 9080384280691289475} - component: {fileID: 5342100355408239326} - m_Layer: 0 + m_Layer: 21 m_Name: Vomit m_TagString: Untagged m_Icon: {fileID: 0} @@ -85,6 +87,66 @@ SpriteRenderer: m_WasSpriteAssigned: 1 m_MaskInteraction: 0 m_SpriteSortPoint: 0 +--- !u!136 &2605975875765928815 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8216347814332420713} + 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: 2 + m_Radius: 0.7 + m_Height: 1 + m_Direction: 1 + m_Center: {x: 0, y: 0, z: 0} +--- !u!114 &9080384280691289475 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8216347814332420713} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 274b80ab5b659c646ba9338870d14625, type: 3} + m_Name: + m_EditorClassIdentifier: + overrideName: Clean Up + overrideUseMessage: + maxUseDistance: 5 + events: + onSelect: + m_PersistentCalls: + m_Calls: [] + onDeselect: + m_PersistentCalls: + m_Calls: [] + onUse: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 8216347814332420713} + m_TargetAssemblyTypeName: UnityEngine.GameObject, UnityEngine + m_MethodName: SetActive + m_Mode: 6 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 --- !u!114 &5342100355408239326 MonoBehaviour: m_ObjectHideFlags: 0 diff --git a/BlueWater/Assets/EasyGridBuilder Pro/Scripts/Core Grid Scripts/Grid Buildables/BuildableGridObject.cs b/BlueWater/Assets/EasyGridBuilder Pro/Scripts/Core Grid Scripts/Grid Buildables/BuildableGridObject.cs index 2822531be..80bc9fc49 100644 --- a/BlueWater/Assets/EasyGridBuilder Pro/Scripts/Core Grid Scripts/Grid Buildables/BuildableGridObject.cs +++ b/BlueWater/Assets/EasyGridBuilder Pro/Scripts/Core Grid Scripts/Grid Buildables/BuildableGridObject.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using BlueWaterProject; using SoulGames.Utilities; using UnityEngine; using UnityEngine.UI; @@ -49,6 +50,8 @@ namespace SoulGames.EasyGridBuilderPro private bool hasCollider = false; + private static Transform inShipProp; + private void Start() { if (MultiGridManager.Instance.activeGridSystem == null) return; @@ -77,6 +80,8 @@ namespace SoulGames.EasyGridBuilderPro } HandleVisualCanvasGrid(activeGridSystem); } + + inShipProp = GameObject.Find("InShipMap/Props").transform; } private void OnDestroy() @@ -137,7 +142,7 @@ namespace SoulGames.EasyGridBuilderPro { EasyGridBuilderPro activeGridSystem = system; Transform placedObjectTransform = Instantiate(buildableGridObjectTypeSO.objectPrefab[Random.Range(0, buildableGridObjectTypeSO.objectPrefab.Length)], Vector3.zero, Quaternion.identity); - + placedObjectTransform.name = placedObjectTransform.name.Replace("(Clone)","").Trim(); placedObjectTransform.rotation = Quaternion.Euler(0, buildableGridObjectTypeSO.GetRotationAngle(dir), 0); placedObjectTransform.localPosition = worldPosition; @@ -256,6 +261,12 @@ namespace SoulGames.EasyGridBuilderPro buildableGridObject.HandleVisualCanvasGrid(system); buildableGridObject.Setup(); + + placedObjectTransform.SetParent(inShipProp); + if (placedObjectTransform.name == "Toilet") + { + placedObjectTransform.gameObject.AddComponent(); + } return buildableGridObject; }