This commit is contained in:
CortexCore 2024-04-16 04:39:26 +08:00
parent 09037a8958
commit aacf09b2b2
28 changed files with 2571 additions and 550 deletions

View File

@ -625,9 +625,9 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
_parentBlackboard: {fileID: 0}
_serializedBlackboard: '{"_variables":{"Sensor":{"_value":1,"_name":"Sensor","_id":"d648241e-321f-48dd-a4e3-d661ee461283","$type":"NodeCanvas.Framework.Variable`1[[BITKit.Sensors.SmartTargetSensor,
_serializedBlackboard: '{"_variables":{"Sensor":{"_name":"Sensor","_id":"d648241e-321f-48dd-a4e3-d661ee461283","$type":"NodeCanvas.Framework.Variable`1[[BITKit.Sensors.SmartTargetSensor,
BITKit.Sensor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]"},"Target":{"_name":"Target","_id":"7e434d61-d448-41a6-91d9-50c35408f293","$type":"NodeCanvas.Framework.Variable`1[[UnityEngine.Transform,
UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]"},"Entity":{"_value":2,"_name":"Entity","_id":"9c6ef538-dedf-4070-9feb-a71566e239b8","$type":"NodeCanvas.Framework.Variable`1[[BITKit.Entities.Entity,
UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]"},"Entity":{"_value":1,"_name":"Entity","_id":"9c6ef538-dedf-4070-9feb-a71566e239b8","$type":"NodeCanvas.Framework.Variable`1[[BITKit.Entities.Entity,
BITKit.Entities, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]"},"HP":{"_name":"HP","_id":"e1629cd4-44b7-4721-ac3d-36818ff847db","$type":"NodeCanvas.Framework.Variable`1[[System.Int32,
mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"},"IsAlive":{"_name":"IsAlive","_id":"07bceed0-a2a2-4e96-b85e-0ece496626da","$type":"NodeCanvas.Framework.Variable`1[[System.Boolean,
mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"},"Basic
@ -637,14 +637,11 @@ MonoBehaviour:
mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"}}}'
_objectReferences:
- {fileID: 0}
- {fileID: 5547163794359473138}
- {fileID: 6002286783881882295}
_serializedVariables:
- _json: '{"_value":1,"_name":"Sensor","_id":"d648241e-321f-48dd-a4e3-d661ee461283","$type":"NodeCanvas.Framework.Variable`1[[BITKit.Sensors.SmartTargetSensor,
- _json: '{"_name":"Sensor","_id":"d648241e-321f-48dd-a4e3-d661ee461283","$type":"NodeCanvas.Framework.Variable`1[[BITKit.Sensors.SmartTargetSensor,
BITKit.Sensor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]"}'
_references:
- {fileID: 0}
- {fileID: 5547163794359473138}
_references: []
- _json: '{"_name":"Target","_id":"7e434d61-d448-41a6-91d9-50c35408f293","$type":"NodeCanvas.Framework.Variable`1[[UnityEngine.Transform,
UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]"}'
_references: []
@ -948,18 +945,6 @@ PrefabInstance:
m_AddedGameObjects: []
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 2ad4d682518910847b19ed8106c0071a, type: 3}
--- !u!114 &5547163794359473138 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 9015502658869033244, guid: 2ad4d682518910847b19ed8106c0071a,
type: 3}
m_PrefabInstance: {fileID: 3595565691975903982}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7815632634318192345}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 33d6f52a9de8ea149ab70ac4e67a0c36, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!4 &7437684211249510939 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 6256051358093332725, guid: 2ad4d682518910847b19ed8106c0071a,

View File

@ -18,9 +18,6 @@ GameObject:
- component: {fileID: 5020317200630596891}
- component: {fileID: 7936474328313349173}
- component: {fileID: 3691802904714930186}
- component: {fileID: 1663689908842247019}
- component: {fileID: 4359274159838455549}
- component: {fileID: 6659077818004947443}
- component: {fileID: 5179535705297386567}
- component: {fileID: 4204812059243969666}
- component: {fileID: 591561399114057092}
@ -31,6 +28,7 @@ GameObject:
- component: {fileID: 2332545226796783687}
- component: {fileID: 5701445397685345264}
- component: {fileID: 4192408521140958198}
- component: {fileID: 4873303856304307760}
m_Layer: 6
m_Name: Zombie
m_TagString: Untagged
@ -53,6 +51,7 @@ Transform:
m_Children:
- {fileID: 3509096854786611592}
- {fileID: 6503844267943367046}
- {fileID: 8461637830315704982}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &8426729501548603387
@ -113,7 +112,7 @@ MonoBehaviour:
- rid: 33717727055315050
type: {class: DictionaryReference, ns: BITKit, asm: BITKit}
data:
index: 682457707
index: -1058870509
keyword: z
--- !u!95 &673930142905110667
Animator:
@ -229,96 +228,6 @@ NavMeshAgent:
m_BaseOffset: 0
m_WalkableMask: 4294967295
m_ObstacleAvoidanceType: 4
--- !u!114 &1663689908842247019
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1610736432900663163}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: aad115aca74ce3c4891b3f6de0b4aae8, type: 3}
m_Name:
m_EditorClassIdentifier:
_serializedExposedParameters: []
_boundGraphSerialization:
_boundGraphObjectReferences: []
_boundGraphSource:
_version: 0
_category:
_comments:
_translation: {x: 0, y: 0}
_zoomFactor: 1
_firstActivation: 2
_enableAction: 1
_disableAction: 0
_lockBoundGraphPrefabOverrides: 1
_preInitializeSubGraphs: 0
_updateMode: 0
_graph: {fileID: 11400000, guid: b7391ad4ecc8f5a43a7742936d9d746c, type: 2}
_blackboard: {fileID: 4359274159838455549}
--- !u!114 &4359274159838455549
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1610736432900663163}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: b98a6db0b653f764eac834f85857a9dd, type: 3}
m_Name:
m_EditorClassIdentifier:
_parentBlackboard: {fileID: 0}
_serializedBlackboard: '{"_variables":{"Sensor":{"_value":1,"_name":"Sensor","_id":"d648241e-321f-48dd-a4e3-d661ee461283","$type":"NodeCanvas.Framework.Variable`1[[BITKit.Sensors.SmartTargetSensor,
BITKit.Sensor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]"},"Target":{"_name":"Target","_id":"7e434d61-d448-41a6-91d9-50c35408f293","$type":"NodeCanvas.Framework.Variable`1[[UnityEngine.Transform,
UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]"},"AttackAction":{"_name":"AttackAction","_id":"44829776-9918-4b67-9b7d-bd016fbe659f","$type":"NodeCanvas.Framework.Variable`1[[BITKit.MonoAction,
BITKit, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]"},"Entity":{"_value":2,"_name":"Entity","_id":"9c6ef538-dedf-4070-9feb-a71566e239b8","$type":"NodeCanvas.Framework.Variable`1[[BITKit.Entities.Entity,
BITKit.Entities, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]"},"IsAlive":{"_name":"IsAlive","_id":"583d9c15-3c5b-4ebc-9e6f-589f21505616","$type":"NodeCanvas.Framework.Variable`1[[System.Boolean,
mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"},"HP":{"_name":"HP","_id":"e1629cd4-44b7-4721-ac3d-36818ff847db","$type":"NodeCanvas.Framework.Variable`1[[System.Int32,
mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"}}}'
_objectReferences:
- {fileID: 0}
- {fileID: 8182690404236474479}
- {fileID: 1765543596226114749}
_serializedVariables:
- _json: '{"_value":1,"_name":"Sensor","_id":"d648241e-321f-48dd-a4e3-d661ee461283","$type":"NodeCanvas.Framework.Variable`1[[BITKit.Sensors.SmartTargetSensor,
BITKit.Sensor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]"}'
_references:
- {fileID: 0}
- {fileID: 8182690404236474479}
- _json: '{"_name":"Target","_id":"7e434d61-d448-41a6-91d9-50c35408f293","$type":"NodeCanvas.Framework.Variable`1[[UnityEngine.Transform,
UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]"}'
_references: []
- _json: '{"_name":"AttackAction","_id":"44829776-9918-4b67-9b7d-bd016fbe659f","$type":"NodeCanvas.Framework.Variable`1[[BITKit.MonoAction,
BITKit, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]"}'
_references: []
- _json: '{"_value":1,"_name":"Entity","_id":"9c6ef538-dedf-4070-9feb-a71566e239b8","$type":"NodeCanvas.Framework.Variable`1[[BITKit.Entities.Entity,
BITKit.Entities, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]"}'
_references:
- {fileID: 0}
- {fileID: 1765543596226114749}
- _json: '{"_name":"IsAlive","_id":"583d9c15-3c5b-4ebc-9e6f-589f21505616","$type":"NodeCanvas.Framework.Variable`1[[System.Boolean,
mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"}'
_references: []
- _json: '{"_name":"HP","_id":"e1629cd4-44b7-4721-ac3d-36818ff847db","$type":"NodeCanvas.Framework.Variable`1[[System.Int32,
mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"}'
_references: []
--- !u!114 &6659077818004947443
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1610736432900663163}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 77a2220c9a6ca8b479573c0f424a4d2c, type: 3}
m_Name:
m_EditorClassIdentifier:
behaviourTree: {fileID: 1663689908842247019}
blackboard: {fileID: 4359274159838455549}
--- !u!114 &5179535705297386567
MonoBehaviour:
m_ObjectHideFlags: 0
@ -429,7 +338,7 @@ MonoBehaviour:
- rid: 7707058052847370280
type: {class: SensorMonoProxy, ns: BITKit.Sensors, asm: BITKit.Sensor}
data:
monoBehaviour: {fileID: 8182690404236474479}
monoBehaviour: {fileID: 0}
--- !u!114 &6530587526832555870
MonoBehaviour:
m_ObjectHideFlags: 0
@ -628,6 +537,57 @@ Rigidbody:
m_Interpolate: 0
m_Constraints: 126
m_CollisionDetection: 0
--- !u!114 &4873303856304307760
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1610736432900663163}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 078a770363d5628419717cb5d9185c51, type: 3}
m_Name:
m_EditorClassIdentifier:
stateMachine:
states:
- rid: 1450174819340386310
- rid: 1450174819340386311
- rid: 1450174819340386312
_currentStateName:
debug: 0
transitionOnNextFrame: 0
ticker:
rid: 1450174819340386308
agent: {fileID: 3691802904714930186}
rangeSensor: {fileID: 8443497955954441676}
audioSensor: {fileID: 4975421454249292524}
selfTag: {fileID: 2126668844316887849}
friendTag: {fileID: 7796253121890493493}
enemyTag: {fileID: 5294749784761799474}
references:
version: 2
RefIds:
- rid: 1450174819340386308
type: {class: GameTick, ns: BITKit, asm: BITKit}
data:
- rid: 1450174819340386310
type: {class: Idle, ns: BITFALL.AI.States, asm: BITFALL.Entities.AI.Runtime}
data:
Service: {fileID: 0}
- rid: 1450174819340386311
type: {class: Alert, ns: BITFALL.AI.States, asm: BITFALL.Entities.AI.Runtime}
data:
Service: {fileID: 0}
initialAlertTime: 5
immediatelyDetectDistance: 5
detectedWeight: 0
- rid: 1450174819340386312
type: {class: Combat, ns: BITFALL.AI.States, asm: BITFALL.Entities.AI.Runtime}
data:
Service: {fileID: 0}
lostTargetTime: 16
currentLostTargetTime: 0
--- !u!1 &4091319875833546166
GameObject:
m_ObjectHideFlags: 0
@ -768,24 +728,214 @@ PrefabInstance:
m_AddedGameObjects: []
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 2ad4d682518910847b19ed8106c0071a, type: 3}
--- !u!4 &6503844267943367046 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 6256051358093332725, guid: 2ad4d682518910847b19ed8106c0071a,
type: 3}
m_PrefabInstance: {fileID: 906277369666945395}
m_PrefabAsset: {fileID: 0}
--- !u!114 &8182690404236474479 stripped
--- !u!114 &4975421454249292524 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 9015502658869033244, guid: 2ad4d682518910847b19ed8106c0071a,
m_CorrespondingSourceObject: {fileID: 5305100744181658527, guid: 2ad4d682518910847b19ed8106c0071a,
type: 3}
m_PrefabInstance: {fileID: 906277369666945395}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 33d6f52a9de8ea149ab70ac4e67a0c36, type: 3}
m_Script: {fileID: 11500000, guid: d7841c9177d83e54594af3d7a9ec4b08, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!4 &6503844267943367046 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 6256051358093332725, guid: 2ad4d682518910847b19ed8106c0071a,
type: 3}
m_PrefabInstance: {fileID: 906277369666945395}
m_PrefabAsset: {fileID: 0}
--- !u!114 &8443497955954441676 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 8772707305530588351, guid: 2ad4d682518910847b19ed8106c0071a,
type: 3}
m_PrefabInstance: {fileID: 906277369666945395}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 8f305912600022b4c824367828ddc333, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1001 &1693532935742515987
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
serializedVersion: 3
m_TransformParent: {fileID: 5964803017347144284}
m_Modifications:
- target: {fileID: 6843811012753684513, guid: b7f40e45b9f64fe4995e6a1b834d17d9,
type: 3}
propertyPath: reference.Array.size
value: 1
objectReference: {fileID: 0}
- target: {fileID: 6843811012753684513, guid: b7f40e45b9f64fe4995e6a1b834d17d9,
type: 3}
propertyPath: managedReferences[-2]
value:
objectReference: {fileID: 0}
- target: {fileID: 6843811012753684513, guid: b7f40e45b9f64fe4995e6a1b834d17d9,
type: 3}
propertyPath: reference.Array.data[0]
value: 1450174819340386318
objectReference: {fileID: 0}
- target: {fileID: 6843811012753684513, guid: b7f40e45b9f64fe4995e6a1b834d17d9,
type: 3}
propertyPath: managedReferences[1450174819340386316]
value: BITKit BITKit.Reference
objectReference: {fileID: 0}
- target: {fileID: 6843811012753684513, guid: b7f40e45b9f64fe4995e6a1b834d17d9,
type: 3}
propertyPath: managedReferences[1450174819340386317]
value: BITKit BITKit.ReferenceScriptableObject
objectReference: {fileID: 0}
- target: {fileID: 6843811012753684513, guid: b7f40e45b9f64fe4995e6a1b834d17d9,
type: 3}
propertyPath: managedReferences[1450174819340386318]
value: BITKit BITKit.DictionaryReference
objectReference: {fileID: 0}
- target: {fileID: 6843811012753684513, guid: b7f40e45b9f64fe4995e6a1b834d17d9,
type: 3}
propertyPath: managedReferences[1450174819340386317].so
value:
objectReference: {fileID: 0}
- target: {fileID: 6843811012753684513, guid: b7f40e45b9f64fe4995e6a1b834d17d9,
type: 3}
propertyPath: managedReferences[1450174819340386316].value
value:
objectReference: {fileID: 0}
- target: {fileID: 6843811012753684513, guid: b7f40e45b9f64fe4995e6a1b834d17d9,
type: 3}
propertyPath: managedReferences[1450174819340386318].index
value: 1301705678
objectReference: {fileID: 0}
- target: {fileID: 6843811012753684513, guid: b7f40e45b9f64fe4995e6a1b834d17d9,
type: 3}
propertyPath: managedReferences[1450174819340386318].keyword
value: huma
objectReference: {fileID: 0}
- target: {fileID: 7128465923029264773, guid: b7f40e45b9f64fe4995e6a1b834d17d9,
type: 3}
propertyPath: m_LocalPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7128465923029264773, guid: b7f40e45b9f64fe4995e6a1b834d17d9,
type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7128465923029264773, guid: b7f40e45b9f64fe4995e6a1b834d17d9,
type: 3}
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7128465923029264773, guid: b7f40e45b9f64fe4995e6a1b834d17d9,
type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 7128465923029264773, guid: b7f40e45b9f64fe4995e6a1b834d17d9,
type: 3}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7128465923029264773, guid: b7f40e45b9f64fe4995e6a1b834d17d9,
type: 3}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7128465923029264773, guid: b7f40e45b9f64fe4995e6a1b834d17d9,
type: 3}
propertyPath: m_LocalRotation.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7128465923029264773, guid: b7f40e45b9f64fe4995e6a1b834d17d9,
type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7128465923029264773, guid: b7f40e45b9f64fe4995e6a1b834d17d9,
type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7128465923029264773, guid: b7f40e45b9f64fe4995e6a1b834d17d9,
type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8051666175491085143, guid: b7f40e45b9f64fe4995e6a1b834d17d9,
type: 3}
propertyPath: m_Name
value: Tags
objectReference: {fileID: 0}
- target: {fileID: 8913039084940381990, guid: b7f40e45b9f64fe4995e6a1b834d17d9,
type: 3}
propertyPath: reference.Array.size
value: 1
objectReference: {fileID: 0}
- target: {fileID: 8913039084940381990, guid: b7f40e45b9f64fe4995e6a1b834d17d9,
type: 3}
propertyPath: managedReferences[-2]
value:
objectReference: {fileID: 0}
- target: {fileID: 8913039084940381990, guid: b7f40e45b9f64fe4995e6a1b834d17d9,
type: 3}
propertyPath: reference.Array.data[0]
value: 1450174819340386315
objectReference: {fileID: 0}
- target: {fileID: 8913039084940381990, guid: b7f40e45b9f64fe4995e6a1b834d17d9,
type: 3}
propertyPath: managedReferences[1450174819340386315]
value: BITKit BITKit.DictionaryReference
objectReference: {fileID: 0}
- target: {fileID: 8913039084940381990, guid: b7f40e45b9f64fe4995e6a1b834d17d9,
type: 3}
propertyPath: managedReferences[1450174819340386315].index
value: -1058870509
objectReference: {fileID: 0}
- target: {fileID: 8913039084940381990, guid: b7f40e45b9f64fe4995e6a1b834d17d9,
type: 3}
propertyPath: managedReferences[1450174819340386315].keyword
value: zom
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: b7f40e45b9f64fe4995e6a1b834d17d9, type: 3}
--- !u!114 &5294749784761799474 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 6843811012753684513, guid: b7f40e45b9f64fe4995e6a1b834d17d9,
type: 3}
m_PrefabInstance: {fileID: 1693532935742515987}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: a39bc549257f2e94cbb86ae99c0107c4, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!114 &7796253121890493493 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 8913039084940381990, guid: b7f40e45b9f64fe4995e6a1b834d17d9,
type: 3}
m_PrefabInstance: {fileID: 1693532935742515987}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: a39bc549257f2e94cbb86ae99c0107c4, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!4 &8461637830315704982 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 7128465923029264773, guid: b7f40e45b9f64fe4995e6a1b834d17d9,
type: 3}
m_PrefabInstance: {fileID: 1693532935742515987}
m_PrefabAsset: {fileID: 0}
--- !u!1001 &1865042540434023482
PrefabInstance:
m_ObjectHideFlags: 0

View File

@ -78,6 +78,11 @@ PrefabInstance:
propertyPath: rmsCount
value: 6
objectReference: {fileID: 0}
- target: {fileID: 3613778988776262925, guid: 27719a3d454f29b4381adf6c7c1bd84d,
type: 3}
propertyPath: outlineWidth
value: 0.16
objectReference: {fileID: 0}
- target: {fileID: 5514379543162470980, guid: 27719a3d454f29b4381adf6c7c1bd84d,
type: 3}
propertyPath: m_Name
@ -99,18 +104,14 @@ PrefabInstance:
- targetCorrespondingSourceObject: {fileID: 5514379543162470980, guid: 27719a3d454f29b4381adf6c7c1bd84d,
type: 3}
insertIndex: 6
addedObject: {fileID: 8092395782639463146}
- targetCorrespondingSourceObject: {fileID: 5514379543162470980, guid: 27719a3d454f29b4381adf6c7c1bd84d,
type: 3}
insertIndex: 7
addedObject: {fileID: 4709101312187563039}
- targetCorrespondingSourceObject: {fileID: 5514379543162470980, guid: 27719a3d454f29b4381adf6c7c1bd84d,
type: 3}
insertIndex: 8
insertIndex: 7
addedObject: {fileID: 768493181001795629}
- targetCorrespondingSourceObject: {fileID: 5514379543162470980, guid: 27719a3d454f29b4381adf6c7c1bd84d,
type: 3}
insertIndex: 9
insertIndex: 8
addedObject: {fileID: 7499168752360152102}
m_SourcePrefab: {fileID: 100100000, guid: 27719a3d454f29b4381adf6c7c1bd84d, type: 3}
--- !u!54 &199638012735786757 stripped
@ -131,22 +132,6 @@ GameObject:
type: 3}
m_PrefabInstance: {fileID: 6414151364918162970}
m_PrefabAsset: {fileID: 0}
--- !u!114 &8092395782639463146
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1550547054305604702}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 52b4c3dc3ca60bb4cb422821e6d7ff38, type: 3}
m_Name:
m_EditorClassIdentifier:
spawnOnStart: 1
lootDrop: {fileID: 11400000, guid: fde747998659fed4ab4b95496f9a9cbd, type: 2}
container: {fileID: 6099372863546542444}
count: 1
--- !u!95 &4709101312187563039
Animator:
serializedVersion: 5

View File

@ -241,6 +241,9 @@ MonoBehaviour:
physicsBasedAnimation:
allow: 1
value: {fileID: 3862100421307477824}
aliveRigidbody:
allow: 0
value: {fileID: 0}
references:
version: 2
RefIds:
@ -321,19 +324,8 @@ MonoBehaviour:
- rid: 7707058030789525626
type: {class: Walk, ns: BITFALL.Movement.MotionBased.States, asm: BITFALL.Entities.Movement.Runtime}
data:
_state:
_FadeDuration: 0.25
_Events:
_NormalizedTimes: []
_Callbacks: []
_Names: []
_Speed: 1
_Animations: []
_Speeds: []
_SynchronizeChildren:
_Thresholds: []
_DefaultParameter: 0
_ExtrapolateSpeed: 1
entryClips: []
clips: []
- rid: 7707058030789525638
type: {class: IdleTurn, ns: BITFALL.Movement.MotionBased.States, asm: BITFALL.Entities.Movement.Runtime}
data:
@ -393,22 +385,19 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
_parentBlackboard: {fileID: 0}
_serializedBlackboard: '{"_variables":{"Sensor":{"_value":1,"_name":"Sensor","_id":"d648241e-321f-48dd-a4e3-d661ee461283","$type":"NodeCanvas.Framework.Variable`1[[BITKit.Sensors.SmartTargetSensor,
_serializedBlackboard: '{"_variables":{"Sensor":{"_name":"Sensor","_id":"d648241e-321f-48dd-a4e3-d661ee461283","$type":"NodeCanvas.Framework.Variable`1[[BITKit.Sensors.SmartTargetSensor,
BITKit.Sensor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]"},"Target":{"_name":"Target","_id":"7e434d61-d448-41a6-91d9-50c35408f293","$type":"NodeCanvas.Framework.Variable`1[[UnityEngine.Transform,
UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]"},"Entity":{"_value":2,"_name":"Entity","_id":"9c6ef538-dedf-4070-9feb-a71566e239b8","$type":"NodeCanvas.Framework.Variable`1[[BITKit.Entities.Entity,
UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]"},"Entity":{"_value":1,"_name":"Entity","_id":"9c6ef538-dedf-4070-9feb-a71566e239b8","$type":"NodeCanvas.Framework.Variable`1[[BITKit.Entities.Entity,
BITKit.Entities, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]"},"IsAlive":{"_name":"IsAlive","_id":"583d9c15-3c5b-4ebc-9e6f-589f21505616","$type":"NodeCanvas.Framework.Variable`1[[System.Boolean,
mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"},"HP":{"_name":"HP","_id":"e1629cd4-44b7-4721-ac3d-36818ff847db","$type":"NodeCanvas.Framework.Variable`1[[System.Int32,
mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"}}}'
_objectReferences:
- {fileID: 0}
- {fileID: 7313871570116796115}
- {fileID: 487596900774587583}
_serializedVariables:
- _json: '{"_value":1,"_name":"Sensor","_id":"d648241e-321f-48dd-a4e3-d661ee461283","$type":"NodeCanvas.Framework.Variable`1[[BITKit.Sensors.SmartTargetSensor,
- _json: '{"_name":"Sensor","_id":"d648241e-321f-48dd-a4e3-d661ee461283","$type":"NodeCanvas.Framework.Variable`1[[BITKit.Sensors.SmartTargetSensor,
BITKit.Sensor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]"}'
_references:
- {fileID: 0}
- {fileID: 7313871570116796115}
_references: []
- _json: '{"_name":"Target","_id":"7e434d61-d448-41a6-91d9-50c35408f293","$type":"NodeCanvas.Framework.Variable`1[[UnityEngine.Transform,
UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]"}'
_references: []
@ -534,7 +523,7 @@ MonoBehaviour:
- rid: 7707058052847370262
type: {class: SensorMonoProxy, ns: BITKit.Sensors, asm: BITKit.Sensor}
data:
monoBehaviour: {fileID: 7313871570116796115}
monoBehaviour: {fileID: 0}
--- !u!1001 &1773688828836030415
PrefabInstance:
m_ObjectHideFlags: 0
@ -644,18 +633,6 @@ Transform:
type: 3}
m_PrefabInstance: {fileID: 1773688828836030415}
m_PrefabAsset: {fileID: 0}
--- !u!114 &7313871570116796115 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 9015502658869033244, guid: 2ad4d682518910847b19ed8106c0071a,
type: 3}
m_PrefabInstance: {fileID: 1773688828836030415}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 33d6f52a9de8ea149ab70ac4e67a0c36, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1001 &4561683943698286367
PrefabInstance:
m_ObjectHideFlags: 0

View File

@ -1004,6 +1004,7 @@ GameObject:
serializedVersion: 6
m_Component:
- component: {fileID: 4826102346843731735}
- component: {fileID: 6313379856987838926}
- component: {fileID: 2634754629000604700}
- component: {fileID: 6417910595033156401}
- component: {fileID: 6002452162850529175}
@ -1088,6 +1089,29 @@ Transform:
- {fileID: 5853897294963205446}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &6313379856987838926
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4826102346843731729}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: a39bc549257f2e94cbb86ae99c0107c4, type: 3}
m_Name:
m_EditorClassIdentifier:
tags: []
reference:
- rid: 1450174819340386319
references:
version: 2
RefIds:
- rid: 1450174819340386319
type: {class: DictionaryReference, ns: BITKit, asm: BITKit}
data:
index: 1301705678
keyword: ca
--- !u!114 &2634754629000604700
MonoBehaviour:
m_ObjectHideFlags: 0

View File

@ -44,7 +44,11 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: d7841c9177d83e54594af3d7a9ec4b08, type: 3}
m_Name:
m_EditorClassIdentifier:
autoUpdate: 1
radius: 24
ignoreTags:
allow: 0
value: []
--- !u!1 &6742090447984940087
GameObject:
m_ObjectHideFlags: 0
@ -54,7 +58,6 @@ GameObject:
serializedVersion: 6
m_Component:
- component: {fileID: 6256051358093332725}
- component: {fileID: 9015502658869033244}
m_Layer: 0
m_Name: Sensor
m_TagString: Untagged
@ -79,44 +82,6 @@ Transform:
- {fileID: 6750927362237252721}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &9015502658869033244
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6742090447984940087}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 33d6f52a9de8ea149ab70ac4e67a0c36, type: 3}
m_Name:
m_EditorClassIdentifier:
autoUpdate: 1
ignoreTags:
allow: 0
value: []
optionalRetargetInterval:
allow: 1
value:
Interval: 1
lostTargetInterval:
allow: 1
value: 16
detectedTime:
allow: 1
value: 0.5
root: {fileID: 0}
sensor:
rid: 806583310205321480
audioSensor: {fileID: 5305100744181658527}
updateCount: 0
references:
version: 2
RefIds:
- rid: 806583310205321480
type: {class: UnitySensor, ns: BITKit.Sensors, asm: BITKit.Sensor}
data:
gameObject: {fileID: 9148787559049777921}
--- !u!1 &9148787559049777921
GameObject:
m_ObjectHideFlags: 0
@ -164,7 +129,7 @@ MonoBehaviour:
detectLayer:
serializedVersion: 2
m_Bits: 64
autoUpdate: 0
autoUpdate: 1
ignoreColliders:
- {fileID: 0}
detected: []

View File

@ -0,0 +1,133 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &1911735542554646388
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6322495096740132473}
- component: {fileID: 8913039084940381990}
m_Layer: 6
m_Name: FriendTag
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &6322495096740132473
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1911735542554646388}
serializedVersion: 2
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_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 7128465923029264773}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &8913039084940381990
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1911735542554646388}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: a39bc549257f2e94cbb86ae99c0107c4, type: 3}
m_Name:
m_EditorClassIdentifier:
tags: []
reference: []
references:
version: 2
RefIds: []
--- !u!1 &2921918470595128776
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 5113332931155271858}
- component: {fileID: 6843811012753684513}
m_Layer: 6
m_Name: EnemyTag
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &5113332931155271858
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2921918470595128776}
serializedVersion: 2
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_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 7128465923029264773}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &6843811012753684513
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2921918470595128776}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: a39bc549257f2e94cbb86ae99c0107c4, type: 3}
m_Name:
m_EditorClassIdentifier:
tags: []
reference: []
references:
version: 2
RefIds: []
--- !u!1 &8051666175491085143
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 7128465923029264773}
m_Layer: 6
m_Name: Tags
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &7128465923029264773
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8051666175491085143}
serializedVersion: 2
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_ConstrainProportionsScale: 0
m_Children:
- {fileID: 6322495096740132473}
- {fileID: 5113332931155271858}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}

File diff suppressed because it is too large Load Diff

View File

@ -11,7 +11,8 @@
"GUID:1235ca61e7f433b408ed5a68767e7123",
"GUID:508392158bd966c4d9c21e19661a441d",
"GUID:f51ebe6a0ceec4240a699833d6309b23",
"GUID:2dbcdde5f5df6a343a36c62f12bd6fae"
"GUID:2dbcdde5f5df6a343a36c62f12bd6fae",
"GUID:705b66b7892e7524f912fd152f5d5251"
],
"includePlatforms": [],
"excludePlatforms": [],

View File

@ -0,0 +1,194 @@
using System;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Data.Odbc;
using System.Linq;
using BITKit;
using BITKit.AI.States;
using BITKit.Entities;
using BITKit.StateMachine;
using UnityEngine;
using UnityEngine.AI;
namespace BITFALL.AI.States
{
public abstract class AIRuntimeState : AIState
{
[Inject,HideInInspector] public AIService Service;
private readonly ConcurrentDictionary<ulong, bool> _friends = new();
private readonly ConcurrentDictionary<ulong, bool> _enemies = new();
protected readonly CacheList<IEntity> detectedEnemies = new();
public bool IsFriend(IEntity target) => _friends.GetOrAdd(target.Id, IsFriendInternal);
public bool IsEnemy(IEntity target) => _enemies.GetOrAdd(target.Id, IsEnemyInternal);
public override void OnStateUpdate(float deltaTime)
{
base.OnStateUpdate(deltaTime);
detectedEnemies.Clear();
foreach (var x in Service.RangeSensor.Get())
{
if (x.TryGetComponent<IEntity>(out var entity) is false) continue;
if (IsEnemy(entity) is false)continue;
detectedEnemies.Add(entity);
}
}
private bool IsEnemyInternal(ulong id)
{
var target = UnityEntitiesService.Get(id);
var tags = target.As<MonoBehaviour>().GetComponent<ITag>().GetTags();
foreach (var x in Service.EnemyTag.GetTags())
{
if (tags.Contains(x)) return true;
}
return false;
}
private bool IsFriendInternal(ulong id)
{
var target = UnityEntitiesService.Get(id);
var tags = target.As<MonoBehaviour>().GetComponent<ITag>().GetTags();
foreach (var x in Service.FriendTag.GetTags())
{
if (tags.Contains(x)) return true;
}
return false;
}
}
[Serializable]
[CustomType(typeof(AI_Idle))]
public sealed class Idle : AIRuntimeState, AI_Idle
{
public override void OnStateEntry(IState old)
{
base.OnStateEntry(old);
Service.Agent.isStopped = true;
}
public override void OnStateUpdate(float deltaTime)
{
base.OnStateUpdate(deltaTime);
//foreach (var x in Service.AudioSensor.Get().Union(Service.RangeSensor.Get()))
foreach (var entity in detectedEnemies)
{
Service.CombatTarget = entity;
Service.TransitionState<Alert>();
}
}
}
[Serializable]
[CustomType(typeof(AI_Idle))]
public sealed class Alert : AIRuntimeState, AI_Alert
{
public int AlertLevel { get; set; }
public float RemainingAlertTime { get; set; }
[SerializeField] private int initialAlertTime;
[SerializeField] private int immediatelyDetectDistance = 5;
[SerializeField,ReadOnly]private float detectedWeight;
public override void OnStateEntry(IState old)
{
base.OnStateEntry(old);
RemainingAlertTime = initialAlertTime;
detectedWeight = old switch
{
AI_Combat=>0.5f,
_ => 0
};
}
public override void OnStateUpdate(float deltaTime)
{
base.OnStateUpdate(deltaTime);
if (detectedEnemies.Count is 0)
{
detectedWeight -= deltaTime;
}
else
{
foreach (var entity in detectedEnemies)
{
var distance= Vector3.Distance(Service.transform.position, entity.As<MonoBehaviour>().transform.position);
if(distance<=immediatelyDetectDistance)
{
Service.CombatTarget = entity;
Service.TransitionState<Combat>();
return;
}
detectedWeight += deltaTime;
if (detectedWeight >= 1)
{
Service.CombatTarget = entity;
Service.TransitionState<Combat>();
return;
}
}
}
RemainingAlertTime -= deltaTime;
if(RemainingAlertTime<=0)
{
Service.TransitionState<Idle>();
return;
}
}
}
[Serializable]
[CustomType(typeof(AI_Idle))]
public sealed class Combat : AIRuntimeState, AI_Combat
{
public AITarget CurrentTarget => _currentTarget;
private AITarget _currentTarget;
[SerializeField] private float lostTargetTime;
private readonly IntervalUpdate reTargetInterval = new(2);
[SerializeField,ReadOnly]private float currentLostTargetTime;
public override void OnStateEntry(IState old)
{
base.OnStateEntry(old);
currentLostTargetTime = lostTargetTime;
reTargetInterval.Reset();
Service.CombatTarget.TryGetComponent<AITarget>(out _currentTarget);
Service.Agent.isStopped = false;
}
public override void OnStateExit(IState old, IState newState)
{
base.OnStateExit(old, newState);
Service.RangeSensor.transform.localRotation = Quaternion.identity;
}
public override void OnStateUpdate(float deltaTime)
{
base.OnStateUpdate(deltaTime);
Service.RangeSensor.transform.rotation = Service.transform.rotation;
if (reTargetInterval.AllowUpdate)
{
Service.CombatTarget = null;
}
if (Service.CombatTarget is not null)
{
var position = Service.CombatTarget.As<MonoBehaviour>().transform.position;
if (NavMesh.SamplePosition(position, out var hit, 1, NavMesh.AllAreas))
{
Service.Agent.SetDestination(hit.position);
}
}
foreach (var entity in detectedEnemies)
{
currentLostTargetTime = lostTargetTime;
Service.CombatTarget = entity;
Service.CombatTarget.TryGetComponent<AITarget>(out _currentTarget);
return;
}
currentLostTargetTime-=deltaTime;
if(currentLostTargetTime<=0)
{
Service.TransitionState<Alert>();
}
}
}
}

View File

@ -0,0 +1,52 @@
using System.Collections;
using System.Collections.Generic;
using BITFALL.AI.States;
using BITKit;
using BITKit.AI.States;
using BITKit.Entities;
using BITKit.Sensors;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.PlayerLoop;
namespace BITFALL.AI
{
/// <summary>
/// AI服务
/// </summary>
[CustomType(typeof(AIService))]
public class AIService : StateBasedBehavior<AI_Base>
{
[SerializeReference,SubclassSelector] private ITicker ticker;
[SerializeField] private NavMeshAgent agent;
[SerializeField] private RangeSensor rangeSensor;
[SerializeField] private AudioSensor audioSensor;
[SerializeField] private Tag selfTag;
[SerializeField] private Tag friendTag;
[SerializeField] private Tag enemyTag;
public IEntity CombatTarget { get; set; }
public RangeSensor RangeSensor => rangeSensor;
public AudioSensor AudioSensor => audioSensor;
public NavMeshAgent Agent => agent;
public ITag SelfTag => selfTag;
public ITag FriendTag => friendTag;
public ITag EnemyTag => enemyTag;
public override void OnStart()
{
base.OnStart();
ticker.Add(OnTick);
TransitionState<Idle>();
}
private void OnTick(float obj)
{
UpdateState(obj);
}
public override void OnDestroyComponent()
{
base.OnDestroyComponent();
ticker.Remove(OnTick);
}
}
}

View File

@ -0,0 +1,23 @@
{
"name": "BITFALL.Entities.AI.Runtime",
"rootNamespace": "",
"references": [
"GUID:14fe60d984bf9f84eac55c6ea033a8f4",
"GUID:709caf8d7fb6ef24bbba0ab9962a3ad0",
"GUID:7efac18f239530141802fb139776f333",
"GUID:d525ad6bd40672747bde77962f1c401e",
"GUID:49b49c76ee64f6b41bf28ef951cb0e50",
"GUID:705b66b7892e7524f912fd152f5d5251",
"GUID:8c4dd21966739024fbd72155091d199e",
"GUID:508392158bd966c4d9c21e19661a441d"
],
"includePlatforms": [],
"excludePlatforms": [],
"allowUnsafeCode": false,
"overrideReferences": false,
"precompiledReferences": [],
"autoReferenced": true,
"defineConstraints": [],
"versionDefines": [],
"noEngineReferences": false
}

View File

@ -6,9 +6,8 @@ using UnityEngine;
using BITKit;
using BITKit.Animations;
using BITKit.Entities;
using BITKit.Physics;
namespace BITFALL.Entites
namespace BITFALL.Entities
{
public class EntityProxyCharacter : EntityBehavior
{

View File

@ -0,0 +1,6 @@
namespace BITFALL.AI
{
public interface AIActionReason{}
}

View File

@ -0,0 +1,134 @@
// ReSharper disable IdentifierTypo
using System;
using BITFALL.AI;
using BITKit.StateMachine;
using Unity.Mathematics;
namespace BITKit.AI.States
{
//基础定义
public interface AI_Base:IState
{
/// <summary>
/// 为什么进入这个状态
/// </summary>
AIActionReason Reason { get; }
}
[Serializable]
public abstract class AIState:AI_Base
{
public bool Enabled { get; set; }
public AIActionReason Reason { get; set; }
public virtual void Initialize()
{
}
public virtual void OnStateEntry(IState old)
{
}
public virtual void OnStateUpdate(float deltaTime)
{
}
public virtual void OnStateExit(IState old, IState newState)
{
}
}
/// <summary>
/// 静止,无任何行为
/// </summary>
public interface AI_Idle:AI_Base{}
/// <summary>
/// 巡逻,通常是哨兵AI才会有的状态
/// </summary>
public interface AI_Patrol:AI_Base
{
/// <summary>
/// 巡逻点
/// </summary>
float3[] PatrolPoints { get; }
}
/// <summary>
/// AI追踪,通常为丢失目标一定时间后
/// </summary>
public interface AI_Track:AI_Base
{
/// <summary>
/// 当前目标
/// </summary>
AITarget CurrentTarget { get; }
}
/// <summary>
/// AI警戒,此时还未发现敌人
/// </summary>
public interface AI_Alert:AI_Base
{
/// <summary>
/// 当前警戒级别,如果最高则进入战斗状态
/// </summary>
int AlertLevel { get; }
/// <summary>
/// 剩余警戒时间
/// </summary>
float RemainingAlertTime { get; }
}
/// <summary>
/// 战斗状态,明确的敌人
/// </summary>
public interface AI_Combat:AI_Base
{
/// <summary>
/// 当前目标
/// </summary>
AITarget CurrentTarget { get; }
}
/// <summary>
/// 逃跑,通常是人类AI或者特殊感染者才有的状态
/// </summary>
public interface AI_Flee:AI_Base
{
float3 NextPoint { get; }
}
/// <summary>
/// 通常只有感染者AI才会有的状态
/// </summary>
public interface AI_Wander:AI_Base
{
/// <summary>
/// 下一个漫步的位置
/// </summary>
float3 NextPoint { get; }
}
/// <summary>
/// 死亡,回收进AI池
/// </summary>
public interface AI_Death:AI_Base
{
}
/// <summary>
/// 濒死状态,如果一定时间内没有救助,则进入死亡状态
/// </summary>
public interface AI_Dying:AI_Base
{
int RemainingHealthPoint { get; }
}
/// <summary>
/// 探索,通常是人类AI才会有的状态
/// </summary>
public interface AI_Explore:AI_Base
{
}
/// <summary>
/// 行为,这是个口袋状态,任何特殊状态都可以放在这里
/// </summary>
public interface AI_Action:AI_Base
{
}
/// <summary>
/// 休息状态,通常是人类AI在睡眠或者在逃跑成功后会有的状态
/// </summary>
public interface AI_Rest:AI_Base
{
}
}

View File

@ -0,0 +1,11 @@
using Unity.Mathematics;
namespace BITFALL.AI
{
public interface AITarget
{
float3 Position { get; }
quaternion Rotation { get; }
}
}

View File

@ -0,0 +1,18 @@
{
"name": "BITFALL.AI",
"rootNamespace": "",
"references": [
"GUID:14fe60d984bf9f84eac55c6ea033a8f4",
"GUID:d8b63aba1907145bea998dd612889d6b",
"GUID:f51ebe6a0ceec4240a699833d6309b23"
],
"includePlatforms": [],
"excludePlatforms": [],
"allowUnsafeCode": false,
"overrideReferences": false,
"precompiledReferences": [],
"autoReferenced": true,
"defineConstraints": [],
"versionDefines": [],
"noEngineReferences": true
}

View File

@ -2,6 +2,7 @@ namespace BITKit
{
public interface ITag
{
int Hash { get; }
string[] GetTags();
}
}

View File

@ -4,7 +4,7 @@ using System.Collections.Generic;
using BITKit.Core.Tuple;
using UnityEngine;
namespace BITKit.Physics
namespace BITKit
{
[Serializable]
public class JointConfigure

View File

@ -1,10 +1,9 @@
using System.Collections;
using System.Collections.Generic;
using BITKit.Events;
using UnityEditor;
using UnityEngine;
namespace BITKit.Physics
namespace BITKit
{
public class Prop_Physics : MonoBehaviour
{

View File

@ -1,3 +1,4 @@
using System;
using System.Collections;
using System.Collections.Generic;
using Cysharp.Threading.Tasks;
@ -15,9 +16,18 @@ namespace BITKit.Sensors
public class AudioSensor : MonoBehaviour,ISensor
{
[Header(Constant.Header.Settings)]
[SerializeField] private bool autoUpdate;
[SerializeField]private float radius;
[SerializeField] private Optional<string[]> ignoreTags;
private readonly CacheList<Transform> cache = new();
private void OnEnable()
{
Id = GetInstanceID();
SensorQueue.Register(Id,this);
}
private void OnDisable()
{
SensorQueue.UnRegister(Id);
}
public UniTask Execute(float delta)
{
var position = transform.position;
@ -26,7 +36,6 @@ namespace BITKit.Sensors
{
var distance = Vector3.Distance(position, x.Position);
if(distance>radius) continue;
if(ignoreTags.Allow && x.Tag is { } tag1 && tag1.GetTags().Any(ignoreTags.Value.Contains)) continue;
cache.Add(x.Transform);
}
return UniTask.CompletedTask;
@ -35,5 +44,6 @@ namespace BITKit.Sensors
public IEnumerable<Transform> Get() => cache.ValueArray;
public bool IsValid(Collider _collider) => false;
public float GetDistance() => radius;
public bool AutoUpdate=>autoUpdate;
}
}

View File

@ -7,6 +7,7 @@ using Cysharp.Threading.Tasks;
using UnityEngine.Jobs;
using UnityEngine.Pool;
using UnityEngine.Profiling;
using Physics=UnityEngine.Physics;
namespace BITKit.Sensors
{
@ -35,12 +36,12 @@ namespace BITKit.Sensors
}
private readonly DoubleBuffer<IEnumerable<Transform>> _detectedDoubleBuffer = new();
private IEnumerable<Transform> _detectedBuffer;
private IEnumerable<Transform> _detectedBuffer=Array.Empty<Transform>();
public override UniTask Execute(float delta)
{
tempHashSet.Clear();
var length = UnityEngine.Physics.OverlapSphereNonAlloc(Transform.position, radius, colliders, detectLayer);
var length = Physics.OverlapSphereNonAlloc(Transform.position, radius, colliders, detectLayer);
Profiler.BeginSample("Filter Detected Colliders");
var _newDetected = from x in colliders.Take(length) where IsValid(x) select x.transform;
Profiler.EndSample();
@ -93,13 +94,7 @@ namespace BITKit.Sensors
Debug.DrawLine(location, position, Color.green, 1);
return true;
case 1:
if (hits[0].collider == _collider)
{
Debug.DrawLine(location, hits[0].point, Color.blue, 1);
return true;
}
break;
return hits[0].collider == _collider;
default:
var collider1 = _collider;
if (hits.Take(length).Any(Predicate))

View File

@ -3,6 +3,8 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using BITKit.Sensors.States;
using BITKit.StateMachine;
using Cysharp.Threading.Tasks;
#if UNITY_EDITOR
using UnityEditor;
@ -16,270 +18,38 @@ using UnityEngine.UIElements;
namespace BITKit.Sensors
{
public interface ISmartTargetProperty{}
public interface ISmartTargetState:IState{}
/// <summary>
/// 智能目标传感器,根据条件,智能选择目标
/// </summary>
public class SmartTargetSensor :MonoBehaviour,ISensor
public class SmartTargetSensor :StateBasedMonoBehaviour<ISmartTargetState>,ISensor
{
/// <summary>
/// 自动更新
/// </summary>
[Header(Constant.Header.Settings)]
[SerializeField] private bool autoUpdate;
[SerializeField] private Optional<string[]> ignoreTags;
[SerializeField] private Optional<IntervalUpdate> optionalRetargetInterval;
[SerializeField] private Optional<int> lostTargetInterval;
[SerializeField] private Optional<float> detectedTime;
[SerializeField] private Transform root;
/// <summary>
/// 主传感器
/// </summary>
[Header(nameof(Sensor))]
[SerializeField,SerializeReference,SubclassSelector] private ISensor sensor;
[SerializeField] private float radius;
[SerializeField] private RangeSensor rangeSensor;
[SerializeField] private AudioSensor audioSensor;
[Header(Constant.Header.Debug)]
[SerializeReference, ReadOnly] private int updateCount;
public IEnumerable<Transform> Get() =>CurrentTarget is not null ? new[] { CurrentTarget }:Enumerable.Empty<Transform>();
public int Id { get;private set; }
bool ISensor.AutoUpdate => autoUpdate;
internal StringBuilder reportBuilder;
internal readonly DoubleBuffer<string> report=new();
internal readonly IntervalUpdate lostTargetIntervalUpdate = new();
public bool IsValid(Collider _collider)
{
if (!_collider) return false;
if (ignoreTags.Allow)
{
if (_collider.TryGetComponent<ITag>(out var iTags))
{
var tags = iTags.GetTags();
foreach (var x in ignoreTags.Value)
{
if (tags.Contains(x))
{
return false;
}
}
}
}
return true;
}
public float GetDistance() => sensor.GetDistance();
public Transform CurrentTarget { get; private set; }
public ISensorTarget SensorTarget { get; private set; }
public float TargetWeight
{
get => _targetWeight;
set => _targetWeight = Mathf.Clamp(value, 0, 1);
}
private float _targetWeight;
private Vector3 _currentPosition;
private CancellationTokenSource timeoutCancellationTokenSource=new();
public int Id { get; set; }
private readonly CacheList<Transform> _detected=new();
private void OnEnable()
{
lostTargetIntervalUpdate.Interval = lostTargetInterval;
SensorQueue.Register(Id=GetInstanceID(),this);
Id = GetInstanceID();
SensorQueue.Register(Id,this);
}
private void Start()
{
TransitionState<Idle>();
}
private void OnDisable()
{
SensorQueue.UnRegister(Id);
}
public async UniTask Execute(float delta)
public IEnumerable<Transform> Get() => _detected.ValueArray;
public bool IsValid(Collider _collider) => false;
public float GetDistance() => radius;
public UniTask Execute(float delta)
{
delta=Mathf.Clamp(delta,0.01f,2);
try
{
_currentPosition = transform.position;
updateCount++;
timeoutCancellationTokenSource?.Cancel();
timeoutCancellationTokenSource = new CancellationTokenSource();
await sensor.Execute(delta);
if (audioSensor)
{
await audioSensor.Execute(delta);
}
reportBuilder?.AppendLine($"-----BEGIN------{updateCount}");
Profiler.BeginSample("Release Detected Buffer");
if (audioSensor)
{
var heard = audioSensor.Get();
if(heard.Any())
{
CurrentTarget = heard.First();
reportBuilder?.AppendLine($"Heard:{CurrentTarget.name}");
reportBuilder?.AppendLine($"-----Complete------{updateCount}");
return;
}
}
var newDetected = sensor.Get();
if (reportBuilder is not null)
{
reportBuilder.AppendLine($"Detected:{newDetected.Count()}");
foreach (var x in newDetected)
{
reportBuilder.AppendLine(x.name);
}
reportBuilder.AppendLine();
}
Profiler.EndSample();
// ReSharper disable once PossibleMultipleEnumeration
if (newDetected.Contains(CurrentTarget)||newDetected.Contains(SensorTarget?.Transform))
{
lostTargetIntervalUpdate.Reset();
if (optionalRetargetInterval.Allow && optionalRetargetInterval.Value.AllowUpdate)
{
reportBuilder?.AppendLine("Retarget Interval Catch,Search New Target");
}
else
{
reportBuilder?.AppendLine("Current Target Detected,Keep Target");
reportBuilder?.AppendLine($"-----Complete------{updateCount}");
return;
}
}
else if(lostTargetInterval.Allow && CurrentTarget is null)
{
if (lostTargetIntervalUpdate.AllowUpdateWithoutReset)
{
CurrentTarget = null;
reportBuilder?.AppendLine("Lost Target,Search New Target");
}
else if(CurrentTarget is null )
{
SensorTarget?.Detected(TargetWeight-=delta, this, root?root:this);
if (TargetWeight <= 0)
{
SensorTarget = null;
}
reportBuilder?.AppendLine($"Lost Target,Forget After {lostTargetIntervalUpdate.Remaining}s");
}
}
Profiler.BeginSample("Filter Detected");
foreach (var x in newDetected.OrderBy(KeySelector))
{
if(IsValid(x.GetComponent<Collider>()) is false)continue;
SensorTarget = x.GetComponent<ISensorTarget>();
if (detectedTime.Allow && CurrentTarget is null)
{
TargetWeight +=detectedTime.Value / delta;
SensorTarget?.Detected(TargetWeight, this, root?root:this);
reportBuilder?.AppendLine($"New Target See,Weight is:{TargetWeight}");
}
if (detectedTime.Allow is false || TargetWeight >= 1 && CurrentTarget != x)
{
CurrentTarget = x;
SensorTarget?.Detected(1, this, root?root:this);
reportBuilder?.AppendLine($"New Target:{x.name},Is oder by distance");
}
break;
}
Profiler.EndSample();
reportBuilder?.AppendLine($"-----Complete------{updateCount}");
if(reportBuilder is not null)
{
report.Release(reportBuilder.ToString());
reportBuilder.Clear();
}
else
{
report.Clear();
}
}
catch (Exception e)
{
BIT4Log.LogException(e);
}
}
private float KeySelector(Transform x)
{
var distance = Vector3.Distance(_currentPosition, x.position);
reportBuilder?.AppendLine($"Distance:{distance}@{x.name}");
return distance;
}
#if UNITY_EDITOR
private void OnDrawGizmosSelected()
{
try
{
if (!CurrentTarget) return;
Gizmos.DrawLine(transform.position,CurrentTarget.position);
}
catch (UnassignedReferenceException)
{
}
}
#endif
}
#if UNITY_EDITOR
[CustomEditor(typeof(SmartTargetSensor))]
public class SmartTargetSensorInspector:BITInspector<SmartTargetSensor>
{
private ObjectField _objectField;
private Label _reportLabel;
public override VisualElement CreateInspectorGUI()
{
FillDefaultInspector();
CreateSubTitle("Editor Debug Field");
_objectField = root.Create<ObjectField>();
_objectField.objectType = typeof(Transform);
_objectField.SetEnabled(false);
_reportLabel = root.Create<Label>();
_reportLabel.text = "Waiting agent report";
return root;
}
protected override void OnEnabled()
{
base.OnEnabled();
agent.reportBuilder = new();
}
protected override void OnDisabled()
{
base.OnDisabled();
agent.reportBuilder = null;
}
protected override void OnUpdate()
{
if (_objectField is not null)
{
_objectField.value = agent.CurrentTarget;
}
if (agent.reportBuilder is not null && _reportLabel is not null && agent.report.TryGetRelease(out var value))
{
_reportLabel.text = value;
}
CurrentState?.OnStateUpdate(delta);
return UniTask.CompletedTask;
}
}
#endif
}

View File

@ -0,0 +1,30 @@
using System;
using System.Collections;
using System.Collections.Generic;
using BITKit.StateMachine;
using UnityEngine;
namespace BITKit.Sensors.States
{
public abstract class SmartTargetSensorStates : ISmartTargetState
{
public bool Enabled { get; set; }
public virtual void Initialize()
{
}
public virtual void OnStateEntry(IState old)
{
}
public virtual void OnStateUpdate(float deltaTime)
{
}
public virtual void OnStateExit(IState old, IState newState)
{
}
}
[Serializable]
public sealed class Idle : SmartTargetSensorStates
{
}
}

View File

@ -13,7 +13,8 @@ namespace BITKit
[SerializeField] private string[] tags;
[Tooltip("Disable when tags is not empty")]
[SerializeReference,SubclassSelector] private IReference[] reference;
public int Hash => _id is 0 ? _id = MathE.GetHash(GetTags()) : _id;
private int _id;
public string[] GetTags() => CacheTags ??= reference?.Length > 0 ? reference.Select(x => x.Value).ToArray() : tags;
private string[] CacheTags;
public void SetTags(IReference[] newReference)

View File

@ -15,7 +15,7 @@ namespace BITKit.NodeCanvas
public BBParameter<Transform> target;
protected override void OnExecute()
{
target.SetValue(sensor.value.CurrentTarget);
//target.SetValue(sensor.value.CurrentTarget);
EndAction();
}
}

View File

@ -143,3 +143,7 @@ MonoBehaviour:
Value: Cosmetic_Saved_Layout
- Key: -106643984
Value: allow_quest_item
- Key: 1301705678
Value: Camp_Human
- Key: -1058870509
Value: Camp_Zombie