Closes #50 #51 Use Toilet And Vomit, NPC Get Around Points

This commit is contained in:
IDMhan 2023-11-24 02:52:14 +09:00
parent 851911ce39
commit 1a972a3018
9 changed files with 222 additions and 9 deletions

View File

@ -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:
<Toilets>k__BackingField: []
prisonPoint: {fileID: 0}
--- !u!1001 &1254663816
PrefabInstance:

View File

@ -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;

View File

@ -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<Toilet> Toilets { get; set; }
private GameObject usablePrisonDoor;
public Transform prisonPoint;
private void Init()
{
Toilets = new List<Toilet>();
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);
}
}
}

View File

@ -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)

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 88c006e5da3dd43df840619fb049c72f
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -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>();
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;
}
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: a9e567bc086814a5c823025f50d68481
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -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

View File

@ -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()
@ -256,6 +261,12 @@ namespace SoulGames.EasyGridBuilderPro
buildableGridObject.HandleVisualCanvasGrid(system);
buildableGridObject.Setup();
placedObjectTransform.SetParent(inShipProp);
if (placedObjectTransform.name == "Toilet")
{
placedObjectTransform.gameObject.AddComponent<Toilet>();
}
return buildableGridObject;
}