Refactoring of status system to prevent bug w/ events

This commit is contained in:
Antoine H 2021-01-27 15:31:18 +01:00
parent fd8306645b
commit e89483d612
13 changed files with 487 additions and 113 deletions

View file

@ -10,10 +10,27 @@ AnimatorStateMachine:
m_Name: Base Layer m_Name: Base Layer
m_ChildStates: m_ChildStates:
- serializedVersion: 1 - serializedVersion: 1
m_State: {fileID: 7592019148465692952} m_State: {fileID: 689161243993804840}
m_Position: {x: 200, y: 0, z: 0} m_Position: {x: 340, y: -110, z: 0}
- serializedVersion: 1
m_State: {fileID: 945483523725794433}
m_Position: {x: 340, y: -50, z: 0}
- serializedVersion: 1
m_State: {fileID: -6546835001122497277}
m_Position: {x: 340, y: 10, z: 0}
- serializedVersion: 1
m_State: {fileID: 5193190183145152303}
m_Position: {x: 340, y: 70, z: 0}
- serializedVersion: 1
m_State: {fileID: 4275546792374664699}
m_Position: {x: 340, y: 130, z: 0}
m_ChildStateMachines: [] m_ChildStateMachines: []
m_AnyStateTransitions: [] m_AnyStateTransitions:
- {fileID: -8060406279278162474}
- {fileID: 1527863355288071821}
- {fileID: 4293475117908034052}
- {fileID: -7101533724053556337}
- {fileID: -7668192276894405300}
m_EntryTransitions: [] m_EntryTransitions: []
m_StateMachineTransitions: {} m_StateMachineTransitions: {}
m_StateMachineBehaviours: [] m_StateMachineBehaviours: []
@ -21,37 +38,296 @@ AnimatorStateMachine:
m_EntryPosition: {x: 50, y: 120, z: 0} m_EntryPosition: {x: 50, y: 120, z: 0}
m_ExitPosition: {x: 800, y: 120, z: 0} m_ExitPosition: {x: 800, y: 120, z: 0}
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
m_DefaultState: {fileID: 7592019148465692952} m_DefaultState: {fileID: 689161243993804840}
--- !u!91 &9100000 --- !u!1101 &-8060406279278162474
AnimatorController: AnimatorStateTransition:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0} m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0} m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_Name: oldman_animator m_Name:
serializedVersion: 5 m_Conditions:
m_AnimatorParameters: [] - m_ConditionMode: 1
m_AnimatorLayers: m_ConditionEvent: entering
- serializedVersion: 5 m_EventTreshold: 0
m_Name: Base Layer m_DstStateMachine: {fileID: 0}
m_StateMachine: {fileID: -8547104927243203257} m_DstState: {fileID: 689161243993804840}
m_Mask: {fileID: 0} m_Solo: 0
m_Motions: [] m_Mute: 0
m_Behaviours: [] m_IsExit: 0
m_BlendingMode: 0 serializedVersion: 3
m_SyncedLayerIndex: -1 m_TransitionDuration: 0.25
m_DefaultWeight: 0 m_TransitionOffset: 0
m_IKPass: 0 m_ExitTime: 0.75
m_SyncedLayerAffectsTiming: 0 m_HasExitTime: 0
m_Controller: {fileID: 9100000} m_HasFixedDuration: 1
--- !u!1102 &7592019148465692952 m_InterruptionSource: 2
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
--- !u!1101 &-7668192276894405300
AnimatorStateTransition:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_Conditions:
- m_ConditionMode: 1
m_ConditionEvent: event
m_EventTreshold: 0
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: 4275546792374664699}
m_Solo: 0
m_Mute: 0
m_IsExit: 0
serializedVersion: 3
m_TransitionDuration: 0.25
m_TransitionOffset: 0
m_ExitTime: 0.75
m_HasExitTime: 0
m_HasFixedDuration: 1
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
--- !u!1101 &-7101533724053556337
AnimatorStateTransition:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_Conditions:
- m_ConditionMode: 1
m_ConditionEvent: leaving
m_EventTreshold: 0
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: 5193190183145152303}
m_Solo: 0
m_Mute: 0
m_IsExit: 0
serializedVersion: 3
m_TransitionDuration: 0.25
m_TransitionOffset: 0
m_ExitTime: 0.75
m_HasExitTime: 0
m_HasFixedDuration: 1
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
--- !u!1102 &-6546835001122497277
AnimatorState: AnimatorState:
serializedVersion: 5 serializedVersion: 5
m_ObjectHideFlags: 1 m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0} m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0} m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_Name: oldman m_Name: Consuming
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: 9548536878b3c884282e98f25bbc699b, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!91 &9100000
AnimatorController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: oldman_animator
serializedVersion: 5
m_AnimatorParameters:
- m_Name: entering
m_Type: 9
m_DefaultFloat: 0
m_DefaultInt: 0
m_DefaultBool: 0
m_Controller: {fileID: 9100000}
- m_Name: waiting
m_Type: 9
m_DefaultFloat: 0
m_DefaultInt: 0
m_DefaultBool: 0
m_Controller: {fileID: 9100000}
- m_Name: consuming
m_Type: 9
m_DefaultFloat: 0
m_DefaultInt: 0
m_DefaultBool: 0
m_Controller: {fileID: 9100000}
- m_Name: leaving
m_Type: 9
m_DefaultFloat: 0
m_DefaultInt: 0
m_DefaultBool: 0
m_Controller: {fileID: 9100000}
- m_Name: event
m_Type: 9
m_DefaultFloat: 0
m_DefaultInt: 0
m_DefaultBool: 0
m_Controller: {fileID: 9100000}
m_AnimatorLayers:
- serializedVersion: 5
m_Name: Base Layer
m_StateMachine: {fileID: -8547104927243203257}
m_Mask: {fileID: 0}
m_Motions: []
m_Behaviours: []
m_BlendingMode: 0
m_SyncedLayerIndex: -1
m_DefaultWeight: 0
m_IKPass: 0
m_SyncedLayerAffectsTiming: 0
m_Controller: {fileID: 9100000}
--- !u!1102 &689161243993804840
AnimatorState:
serializedVersion: 5
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Entering
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: 9548536878b3c884282e98f25bbc699b, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &945483523725794433
AnimatorState:
serializedVersion: 5
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Waiting
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: 9548536878b3c884282e98f25bbc699b, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1101 &1527863355288071821
AnimatorStateTransition:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_Conditions:
- m_ConditionMode: 1
m_ConditionEvent: waiting
m_EventTreshold: 0
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: 945483523725794433}
m_Solo: 0
m_Mute: 0
m_IsExit: 0
serializedVersion: 3
m_TransitionDuration: 0.25
m_TransitionOffset: 0
m_ExitTime: 0.75
m_HasExitTime: 0
m_HasFixedDuration: 1
m_InterruptionSource: 2
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
--- !u!1102 &4275546792374664699
AnimatorState:
serializedVersion: 5
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: In event
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: 9548536878b3c884282e98f25bbc699b, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1101 &4293475117908034052
AnimatorStateTransition:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_Conditions:
- m_ConditionMode: 1
m_ConditionEvent: consuming
m_EventTreshold: 0
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: -6546835001122497277}
m_Solo: 0
m_Mute: 0
m_IsExit: 0
serializedVersion: 3
m_TransitionDuration: 0.25
m_TransitionOffset: 0
m_ExitTime: 0.75
m_HasExitTime: 0
m_HasFixedDuration: 1
m_InterruptionSource: 0
m_OrderedInterruption: 1
m_CanTransitionToSelf: 1
--- !u!1102 &5193190183145152303
AnimatorState:
serializedVersion: 5
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Leaving
m_Speed: 1 m_Speed: 1
m_CycleOffset: 0 m_CycleOffset: 0
m_Transitions: [] m_Transitions: []

View file

@ -43,7 +43,14 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 71c5cbaefd379ae48875ee243e0435c9, type: 3} m_Script: {fileID: 11500000, guid: 71c5cbaefd379ae48875ee243e0435c9, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
range: 10 ready: 0
SpawnRange: 1
spawnChance: 100
maxSoftObs: 1
maxHardObs: 1
SoftObsRessourceFolder: Events/SoftObstacles
HardObsRessourceFolder: Events/HardObstacles
coroutineRefreshRate: 1
--- !u!1 &2157073178696562865 --- !u!1 &2157073178696562865
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -197,8 +204,9 @@ MonoBehaviour:
m_EditorClassIdentifier: m_EditorClassIdentifier:
ready: 0 ready: 0
nbMaxClients: 10 nbMaxClients: 10
clientSpawnTimer: 0.5 clientSpawnChance: 100
maxTimeNewClients: 2 clientFrequency: 1
ClientRessourceFolder: Clients
--- !u!1 &2157073179686492906 --- !u!1 &2157073179686492906
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -285,7 +293,7 @@ Transform:
m_GameObject: {fileID: 2157073180013227982} m_GameObject: {fileID: 2157073180013227982}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 4.86, y: -3.7, z: -3.6281848} m_LocalPosition: {x: 4.86, y: -3.7, z: -3.6281848}
m_LocalScale: {x: 0.1, y: 0.1, z: 0.1} m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: [] m_Children: []
m_Father: {fileID: 2157073180203202247} m_Father: {fileID: 2157073180203202247}
m_RootOrder: 5 m_RootOrder: 5
@ -340,5 +348,6 @@ MonoBehaviour:
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
ready: 0 ready: 0
serviceOpen: 0
serviceTime: 60 serviceTime: 60
slowScale: 0.5 slowScale: 0.5

View file

@ -159,4 +159,5 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 6bcb4ca5242cefc4bb06adff707d9c5f, type: 3} m_Script: {fileID: 11500000, guid: 6bcb4ca5242cefc4bb06adff707d9c5f, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
lifeTime: 3 lifeTime: 20
waitTime: 30

View file

@ -32589,10 +32589,15 @@ PrefabInstance:
propertyPath: clientSpawnChance propertyPath: clientSpawnChance
value: 100 value: 100
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 2157073179837706944, guid: dfb09d229e85c1446bee2e4f9357610e,
type: 3}
propertyPath: m_LocalScale.x
value: 1
objectReference: {fileID: 0}
- target: {fileID: 2157073180203202244, guid: dfb09d229e85c1446bee2e4f9357610e, - target: {fileID: 2157073180203202244, guid: dfb09d229e85c1446bee2e4f9357610e,
type: 3} type: 3}
propertyPath: serviceTime propertyPath: serviceTime
value: 120 value: 60
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 2157073180203202245, guid: dfb09d229e85c1446bee2e4f9357610e, - target: {fileID: 2157073180203202245, guid: dfb09d229e85c1446bee2e4f9357610e,
type: 3} type: 3}
@ -32677,6 +32682,16 @@ PrefabInstance:
- target: {fileID: 7408334756516261553, guid: dfb09d229e85c1446bee2e4f9357610e, - target: {fileID: 7408334756516261553, guid: dfb09d229e85c1446bee2e4f9357610e,
type: 3} type: 3}
propertyPath: spawnChance propertyPath: spawnChance
value: 10
objectReference: {fileID: 0}
- target: {fileID: 7408334756516261553, guid: dfb09d229e85c1446bee2e4f9357610e,
type: 3}
propertyPath: spawnChanceHard
value: 10
objectReference: {fileID: 0}
- target: {fileID: 7408334756516261553, guid: dfb09d229e85c1446bee2e4f9357610e,
type: 3}
propertyPath: spawnChanceSoft
value: 30 value: 30
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 7408334756516261553, guid: dfb09d229e85c1446bee2e4f9357610e, - target: {fileID: 7408334756516261553, guid: dfb09d229e85c1446bee2e4f9357610e,

View file

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

View file

@ -18,56 +18,26 @@ public class Client_controller : MonoBehaviour, IUsable
Animator animator; Animator animator;
string _status; string _status;
string _prevStatus; string _prevStatus;
string _lastStatusRequest=null;
// private readonly object balanceLock = new object();
// bool updatingStatus=false;
HashSet<string> _availStatus = new HashSet<string>(){"entering", "waiting", "consuming", "leaving", "event"}; HashSet<string> _availStatus = new HashSet<string>(){"entering", "waiting", "consuming", "leaving", "event"};
public string status public string status
{ {
get{ return _status;} get{ return _status;}
//BEWARE : Set is only a request. The status is only really set in update.
set{ set{
if (_availStatus.Contains(value)) if (_availStatus.Contains(value))
_prevStatus=_status; {
_status = value; if(value==_status)
animator.SetTrigger(_status); //Update status in animator Debug.LogWarning(gameObject.name+" status is set twice to:"+value);
// Debug.Log(gameObject.name+" "+_status); else //Request change of status
switch (value) {
{ // if(_lastStatusRequest!=null)
case "entering": // Debug.LogWarning(gameObject.name+" status request("+_lastStatusRequest+") is overriden by : "+value);
navObstacle.enabled = false; _lastStatusRequest = value;
agent.enabled = true; }
if(UIWaitingTimer != null) }
UIWaitingTimer.gameObject.SetActive(false);
break;
case "waiting":
EventManager.Instance.startCoroutine(gameObject);
//Switch Agent to obstacle if waiting
agent.Warp(assigedPos); //Make sure agent become static at right position
agent.enabled = false;
navObstacle.enabled = true;
if(UIWaitingTimer != null)
{
UIWaitingTimer.DisplayIcon(true);
UIWaitingTimer.SetValue(1.0f);
UIWaitingTimer.gameObject.SetActive(true);
}
break;
case "consuming":
EventManager.Instance.startCoroutine(gameObject);
if(UIWaitingTimer != null)
UIWaitingTimer.gameObject.SetActive(false);
break;
case "event":
case "leaving":
EventManager.Instance.stopCoroutine(gameObject);
navObstacle.enabled = false;
agent.enabled = true;
if(UIWaitingTimer != null)
UIWaitingTimer.gameObject.SetActive(false);
break;
default:
break;
}
// navObstacle.enabled = value=="waiting";
// agent.enabled = value!="waiting";
} }
} }
@ -78,6 +48,7 @@ public class Client_controller : MonoBehaviour, IUsable
//Navigation //Navigation
Vector2 assigedPos; //Chair to sit or destination to stay (leave) Vector2 assigedPos; //Chair to sit or destination to stay (leave)
Vector2 currentObjective; //Current destination to reach
NavMeshAgent agent; NavMeshAgent agent;
NavMeshObstacle navObstacle; //Obstacle for other agents NavMeshObstacle navObstacle; //Obstacle for other agents
@ -125,21 +96,66 @@ public class Client_controller : MonoBehaviour, IUsable
if(destination is null) if(destination is null)
{ {
status=_prevStatus; status=_prevStatus;
// NavMeshHit hit; currentObjective=assigedPos;
// NavMesh.SamplePosition(gameObject.transform.position, out hit, agent.height*2, NavMesh.AllAreas);
// agent.Warp(hit.position);
if(agent.enabled)
agent.SetDestination(assigedPos);
else
gameObject.transform.position=assigedPos;
} }
else else
{ {
status="event"; status="event";
agent.SetDestination((Vector2)destination); currentObjective=(Vector2)destination;
} }
} }
//Update client attributes in fonction of the newStatus. Should only be called once by Update.
protected void updateStatus(string newStatus)
{
switch (newStatus)
{
case "entering":
navObstacle.enabled = false;
agent.enabled = true;
if(UIWaitingTimer != null)
UIWaitingTimer.gameObject.SetActive(false);
break;
case "waiting":
EventManager.Instance.startCoroutine(gameObject);
//Switch Agent to obstacle if waiting
// agent.Warp(assigedPos); //Make sure agent become static at right position
agent.enabled = false;
navObstacle.enabled = true;
if(UIWaitingTimer != null)
{
UIWaitingTimer.DisplayIcon(true);
UIWaitingTimer.gameObject.SetActive(true);
}
break;
case "consuming":
EventManager.Instance.startCoroutine(gameObject);
if(UIWaitingTimer != null)
UIWaitingTimer.gameObject.SetActive(false);
break;
case "event":
case "leaving":
EventManager.Instance.stopCoroutine(gameObject);
navObstacle.enabled = false;
agent.enabled = true;
if(UIWaitingTimer != null)
UIWaitingTimer.gameObject.SetActive(false);
break;
default:
break;
}
//Navigation
if(agent.enabled) //Assign destination
agent.SetDestination(currentObjective);
else //Warp to destination
gameObject.transform.position=currentObjective;
if(status=="event"&&!agent.enabled)
Debug.LogWarning("Wrong status update : "+ gameObject.name + _prevStatus + status +" "+ _lastStatusRequest);
}
// Start is called before the first frame update // Start is called before the first frame update
void Start() void Start()
{ {
@ -163,8 +179,8 @@ public class Client_controller : MonoBehaviour, IUsable
agent.updateRotation = false; agent.updateRotation = false;
agent.updateUpAxis = false; agent.updateUpAxis = false;
//Get target //Get target
assigedPos = ClientManager.Instance.assignTarget(); //Chair to go currentObjective = assigedPos = ClientManager.Instance.assignTarget(); //Chair to go
agent.SetDestination(assigedPos); // agent.SetDestination(assigedPos);
//Assign Random priority to prevent two agent blocking each other //Assign Random priority to prevent two agent blocking each other
agent.avoidancePriority=Random.Range(0, 99); agent.avoidancePriority=Random.Range(0, 99);
@ -174,9 +190,25 @@ public class Client_controller : MonoBehaviour, IUsable
// Update is called once per frame // Update is called once per frame
void Update() void Update()
{ {
//Update status if it was requested
if(_lastStatusRequest !=null)
{
_prevStatus=_status;
_status = _lastStatusRequest;
animator.SetTrigger(_status); //Update status in animator
updateStatus(_status);
_lastStatusRequest = null;
// Debug.Log(gameObject.name+" "+_status);
}
//Navigation //Navigation
// Debug.Log(gameObject.name + " navigation : "+ agent.isStopped + " " + agent.remainingDistance); // Debug.Log(gameObject.name + " navigation : "+ agent.isStopped + " " + agent.remainingDistance);
Debug.DrawLine(gameObject.transform.position, agent.destination, Color.blue, 0.0f);
if(status=="entering" && !agent.pathPending && agent.remainingDistance==0) //Reached seat ? if(status=="entering" && !agent.pathPending && agent.remainingDistance==0) //Reached seat ?
{ {
status="waiting"; status="waiting";
@ -193,8 +225,8 @@ public class Client_controller : MonoBehaviour, IUsable
{ {
//Leave tavern //Leave tavern
status = "leaving"; status = "leaving";
assigedPos = ClientManager.Instance.assignTarget(assigedPos, true); //Request leaving target currentObjective = assigedPos = ClientManager.Instance.assignTarget(assigedPos, true); //Request leaving target
agent.SetDestination(assigedPos); // agent.SetDestination(assigedPos);
} }
else if(UIWaitingTimer != null) //Update UI Waiting timer else if(UIWaitingTimer != null) //Update UI Waiting timer
UIWaitingTimer.SetValue(waitTimer/waitingTime); UIWaitingTimer.SetValue(waitTimer/waitingTime);
@ -228,10 +260,15 @@ public class Client_controller : MonoBehaviour, IUsable
} }
} }
else if(status=="leaving" && !agent.pathPending && agent.remainingDistance==0) else if(status=="leaving" && !agent.pathPending && agent.remainingDistance<0.5) //Reached exit ?
{ {
Destroy(gameObject); Destroy(gameObject);
} }
else if(status=="event" && !agent.pathPending && agent.remainingDistance==0) //Reached event ?
{
assignToEvent(); //In case events already finished, come back to normal
}
} }
void OnDestroy() void OnDestroy()

View file

@ -10,7 +10,7 @@ using UnityEngine.AI;
public class HardObstacle : MonoBehaviour public class HardObstacle : MonoBehaviour
{ {
[SerializeField] [SerializeField]
float lifeTime = -1.0f; //Time before self-destruct (Negative value to prevent self-destruct) float lifeTime= -1.0f, waitTime= 30.0f; //Time active/waiting before self-destruct (Negative value to prevent self-destruct)
float lifeTimer; float lifeTimer;
List<Client_controller> angryClients = new List<Client_controller>(); //Clients in the fight List<Client_controller> angryClients = new List<Client_controller>(); //Clients in the fight
@ -25,7 +25,7 @@ public class HardObstacle : MonoBehaviour
// Start is called before the first frame update // Start is called before the first frame update
void Start() void Start()
{ {
lifeTimer=lifeTime; lifeTimer=waitTime; //Start by waiting client
ObsCollider = GetComponent<Collider2D>(); ObsCollider = GetComponent<Collider2D>();
@ -39,14 +39,10 @@ public class HardObstacle : MonoBehaviour
// Update is called once per frame // Update is called once per frame
void Update() void Update()
{ {
if(animator.GetBool("active fight") && lifeTimer>0) lifeTimer -= Time.deltaTime;
{ if(lifeTimer<0)
lifeTimer -= Time.deltaTime; Destroy(gameObject);
if(lifeTimer<0)
{
Destroy(gameObject);
}
}
} }
void OnTriggerEnter2D(Collider2D other) void OnTriggerEnter2D(Collider2D other)
@ -54,21 +50,25 @@ public class HardObstacle : MonoBehaviour
Client_controller newClient = other.GetComponent<Client_controller>(); Client_controller newClient = other.GetComponent<Client_controller>();
if(newClient!=null && !angryClients.Contains(newClient)) if(newClient!=null && !angryClients.Contains(newClient))
{ {
angryClients.RemoveAll(item => item == null); //In case clients have been destroyed before event start, remove them
if(newClient.status!="event") //Make sure to set right status if(newClient.status!="event") //Make sure to set right status
newClient.assignToEvent(gameObject.transform.position); newClient.assignToEvent(gameObject.transform.position);
angryClients.Add(newClient); angryClients.Add(newClient);
// Debug.Log("New fighting client. Current nb : "+angryClients.Count); // Debug.Log("New fighting client. Current nb : "+angryClients.Count);
if(angryClients.Count>1)//Start fight if(angryClients.Count>1)//Start fight
{ {
foreach(Client_controller client in angryClients) //Turn off client (to merge for a fight) foreach(Client_controller client in angryClients) //Turn off client (to merge for a fight)
client.gameObject.SetActive(false); client.gameObject.SetActive(false);
animator.SetBool("active fight", true); animator.SetBool("active fight", true);
//Block movement //Block movement
Obstacle.enabled=true; Obstacle.enabled=true;
ObsCollider.isTrigger=false; //Trigger becoming solid ObsCollider.isTrigger=false; //Trigger becoming solid
lifeTimer=lifeTime; //Time before end of the fight
} }
} }
} }
@ -82,7 +82,7 @@ public class HardObstacle : MonoBehaviour
client.assignToEvent(); //Restore previous behavior client.assignToEvent(); //Restore previous behavior
} }
EventManager.Instance.destroyEvent(gameObject); EventManager.Instance.removeEvent(gameObject);
} }
void OnApplicationQuit() void OnApplicationQuit()

View file

@ -62,6 +62,6 @@ public class SoftObstacle : MonoBehaviour
void OnDestroy() void OnDestroy()
{ {
EventManager.Instance.destroyEvent(gameObject); EventManager.Instance.removeEvent(gameObject);
} }
} }

View file

@ -24,7 +24,7 @@ public sealed class EventManager : MonoBehaviour
[SerializeField] [SerializeField]
float SpawnRange = 1.0f; //Range of an event spawn from its origin (real max distance = 2*range) float SpawnRange = 1.0f; //Range of an event spawn from its origin (real max distance = 2*range)
[SerializeField] [SerializeField]
float spawnChance = 100.0f; //Probability of an event to spawn (%) float spawnChanceSoft = 100.0f, spawnChanceHard = 100.0f; //Probability of an event to spawn (%)
[SerializeField] [SerializeField]
int maxSoftObs = 1, maxHardObs = 1; //Maximum active events int maxSoftObs = 1, maxHardObs = 1; //Maximum active events
@ -39,7 +39,7 @@ public sealed class EventManager : MonoBehaviour
private Dictionary<string,Object[]> eventPrefabs = new Dictionary<string,Object[]>(); private Dictionary<string,Object[]> eventPrefabs = new Dictionary<string,Object[]>();
GameObject EventContainer=null; GameObject EventContainer=null;
//List of active event ID //List of active event
List<GameObject> softObsList = new List<GameObject>(); List<GameObject> softObsList = new List<GameObject>();
List<GameObject> hardObsList = new List<GameObject>(); List<GameObject> hardObsList = new List<GameObject>();
@ -81,12 +81,31 @@ public sealed class EventManager : MonoBehaviour
} }
//Remove an event from the EventManager //Remove an event from the EventManager
public void destroyEvent(GameObject eventObj) public void removeEvent(GameObject eventObj)
{ {
softObsList.Remove(eventObj); softObsList.Remove(eventObj);
hardObsList.Remove(eventObj); hardObsList.Remove(eventObj);
} }
//Destroy registered events. Levels : 2 = All events, 1 = Hard Obstacles
public void cleanUp(int level=2)
{
if(level<1)
Debug.Log("EventManager : Called cleanup w/ level inferior to 1. Nothing was done.");
if(level>0) //Clean HardObstacles
{
foreach(GameObject obs in hardObsList)
Destroy(obs);
hardObsList.Clear();
}
if(level>1) //Clean SoftObstacles
{
foreach(GameObject obs in softObsList)
Destroy(obs);
softObsList.Clear();
}
}
//Start an event coroutine for client //Start an event coroutine for client
public void startCoroutine(GameObject client) public void startCoroutine(GameObject client)
{ {
@ -122,8 +141,9 @@ public sealed class EventManager : MonoBehaviour
if(GameSystem.Instance.serviceOpen) if(GameSystem.Instance.serviceOpen)
{ {
//Try to spawn softObs or hardObs randomly //Try to spawn softObs or hardObs randomly
if(Random.value<0.5 && client.status=="consuming") if(Random.value<0.5f)
EventManager.Instance.spawnSoftObs(clientObj.transform.position, spawnChance); if(client.status=="consuming") //Only spawn soft obs while consuming
EventManager.Instance.spawnSoftObs(clientObj.transform.position, spawnChanceSoft);
else else
{ {
List<GameObject> otherClients = findNearClients(clientObj, 1.0f); List<GameObject> otherClients = findNearClients(clientObj, 1.0f);
@ -137,7 +157,7 @@ public sealed class EventManager : MonoBehaviour
//TODO : Compute spawnChance w/ clients happiness //TODO : Compute spawnChance w/ clients happiness
Vector2 eventPos=(clientObj.transform.position+tgtClient.transform.position)/2; //Event pos between clients Vector2 eventPos=(clientObj.transform.position+tgtClient.transform.position)/2; //Event pos between clients
List<Client_controller> targetClients = new List<Client_controller>(){client, tgtClient.GetComponent<Client_controller>()}; List<Client_controller> targetClients = new List<Client_controller>(){client, tgtClient.GetComponent<Client_controller>()};
EventManager.Instance.spawnHardObs(targetClients, eventPos, spawnChance); EventManager.Instance.spawnHardObs(targetClients, eventPos, spawnChanceHard);
} }
} }
} }
@ -228,5 +248,6 @@ public sealed class EventManager : MonoBehaviour
void OnDestroy() void OnDestroy()
{ {
StopAllCoroutines(); StopAllCoroutines();
cleanUp();
} }
} }

View file

@ -46,6 +46,16 @@ public sealed class GameSystem : MonoBehaviour
{ {
serviceTimer=serviceTime; serviceTimer=serviceTime;
serviceOpen=true; serviceOpen=true;
Debug.Log("Service open !");
}
public void endService()
{
serviceOpen=false;
EventManager.Instance.cleanUp(1); //Remove hard obstacle
Debug.Log("Service closed !");
} }
//Change time scale //Change time scale
@ -127,10 +137,7 @@ public sealed class GameSystem : MonoBehaviour
if(UIServiceTimer != null) if(UIServiceTimer != null)
UIServiceTimer.SetValue(serviceTimer/serviceTime); UIServiceTimer.SetValue(serviceTimer/serviceTime);
if (serviceTimer < 0) if (serviceTimer < 0)
{ endService();
serviceOpen = false;
Debug.Log("Service closed");
}
} }
//Temporary manual slowmode toggle //Temporary manual slowmode toggle