feat(assets): 更新蓝色怪物模型导入设置并优化动画配置

- 升级模型导入器版本从2200到22361
- 添加ACL动画压缩配置参数,提升动画性能
- 调整动画循环设置,将loopTime设为1启用循环播放
- 增加虚拟几何体相关配置选项

fix(enemy): 修复敌人AI行为逻辑错误

- 修正敌人在攻击状态下仍会移动的问题
- 改进敌人追踪和巡逻状态转换逻辑
- 修复敌人转向时Y轴旋转导致的异常朝向
- 优化巡逻路径计算,改为水平面内随机移动
- 解决敌人在目标点附近抖动的问题

chore(dependencies): 更新Codely桥接包版本

- 将cn.tuanjie.codely.bridge从1.0.74升级至1.0.75
- 调整依赖包在manifest中的顺序

style(scene): 为场景对象添加物理材质和渲染属性

- 为CharacterController组件分配新的物理材质
- 在多个MeshRenderer组件中添加虚拟几何体和遮挡剔除相关属性
- 配置渲染器遮罩交互参数

config(build): 启用SampleScene场景构建

- 将SampleScene.scene添加到构建设置中
- 设置场景为启用状态以便打包构建
```
This commit is contained in:
huadexuan committed 2026-08-13 15:20:52 +08:00
1 parent 8f7f797691
commit cdae901b96
7 files changed
+246 -39

No files matched your search

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

@@ -1,7 +1,7 @@
fileFormatVersion: 2
guid: DnpM5nn5UH9A01K14f7+nducpOiJrZyg8xxB/KHmXNUFRhe8zGAFL7o=
ModelImporter:
serializedVersion: 22200
serializedVersion: 22361
internalIDToNameTable: []
externalObjects: {}
materials:
@@ -25,6 +25,9 @@ ModelImporter:
importAnimatedCustomProperties: 0
importConstraints: 0
animationCompression: 3
aCLCompressionLevel: 3
aCLCurvePrecision: 0.01
aCLFastSampleMode: 1
animationRotationError: 0.5
animationPositionError: 0.5
animationScaleError: 0.5
@@ -32,7 +35,7 @@ ModelImporter:
extraExposedTransformPaths: []
extraUserProperties: []
clipAnimations:
- serializedVersion: 16
- serializedVersion: 18
name: "\u84DD\u8272\u602A\u7269\u884C\u8D70"
takeName: mixamo.com
internalID: -203655887218126122
@@ -44,7 +47,8 @@ ModelImporter:
cycleOffset: 0
loop: 0
hasAdditiveReferencePose: 0
loopTime: 0
lockToRoot: 0
loopTime: 1
loopBlend: 0
loopBlendOrientation: 0
loopBlendPositionY: 0
@@ -57,24 +61,27 @@ ModelImporter:
bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000
curves: []
events: []
intervals: []
transformMask: []
maskType: 3
maskSource: {instanceID: 0}
additiveReferencePoseFrame: 0
additiveType: 0
basePoseType: 0
additiveSelectedAnimation: {instanceID: 0}
additiveSelectedAnimationFrameIndex: 0
isReadable: 0
virtualGeometry: 0
hasBoneWeight: 0
generateGeometryBuffer: 0
positionPrecision: -2147483648
normalPrecision: -1
tangentPrecision: -1
surfaceCompensation: 0
allMeshUse: 1
ignoreSimpleMesh: 0
tuanjieGIEnable: 0
tuanjieGIGenSDFFactor: 1
tuanjieGIGenSDFBias: 0.25
tuanjieGIDoubleSidedMode: 0
tuanjieGIGenFacetNums: 12
meshes:
lODScreenPercentages: []
globalScale: 1
meshCompression: 0
totalVerticesCount: 0
totalTrianglesCount: 0
addColliders: 0
useSRGBMaterialColor: 1
sortHierarchyByName: 1
@@ -107,6 +114,79 @@ ModelImporter:
secondaryUVPackMargin: 4
useFileScale: 1
strictVertexDataChecks: 0
virtualGeometry:
virtualGeometry: 0
useTransparent: 0
setVGForeachMesh: 0
isFirstUse: 1
virtualGeometrySettings:
generateGeometryBuffer: 0
surfaceCompensation: 0
allMeshUse: 1
ignoreSimpleMesh: 0
transformScaleState: 0
isPossibleOverflow: 0
hasBoneData: 0
isBoneCountOverflow: 0
virtualGeometryPlatformSettings:
- serializedVersion: 0
overridden: 0
ignorePlatformSupport: 0
buildTarget: DefaultVirtualGeometryPlatform
positionPrecision: -2147483648
normalPrecision: -2147483648
tangentPrecision: -2147483648
boneWeightPrecision: -2147483648
detailedTriangleCount: 0
detailedVertexCount: 0
rootPageSize: 0
streamablePageSize: 0
reserveTrianglePercent: 100
reserveDetailLevel: 0
- serializedVersion: 0
overridden: 0
ignorePlatformSupport: 0
buildTarget: Standalone
positionPrecision: -2147483648
normalPrecision: -2147483648
tangentPrecision: -2147483648
boneWeightPrecision: -2147483648
detailedTriangleCount: 0
detailedVertexCount: 0
rootPageSize: 0
streamablePageSize: 0
reserveTrianglePercent: 100
reserveDetailLevel: 0
- serializedVersion: 0
overridden: 0
ignorePlatformSupport: 0
buildTarget: iPhone
positionPrecision: -2147483648
normalPrecision: -2147483648
tangentPrecision: -2147483648
boneWeightPrecision: -2147483648
detailedTriangleCount: 0
detailedVertexCount: 0
rootPageSize: 0
streamablePageSize: 0
reserveTrianglePercent: 100
reserveDetailLevel: 0
- serializedVersion: 0
overridden: 0
ignorePlatformSupport: 0
buildTarget: Android
positionPrecision: -2147483648
normalPrecision: -2147483648
tangentPrecision: -2147483648
boneWeightPrecision: -2147483648
detailedTriangleCount: 0
detailedVertexCount: 0
rootPageSize: 0
streamablePageSize: 0
reserveTrianglePercent: 100
reserveDetailLevel: 0
selectedVGMeshes: []
supportVGMeshes: []
tangentSpace:
normalSmoothAngle: 60
normalImportMode: 0
@@ -117,6 +197,7 @@ ModelImporter:
normalSmoothingSource: 0
referencedClips: []
importAnimation: 1
overrideDefaultPose: 0
humanDescription:
serializedVersion: 3
human:
@@ -520,6 +601,9 @@ ModelImporter:
position: {x: 0.08143586, y: 0, z: 0}
rotation: {x: 0.70710665, y: 0, z: -0, w: 0.7071069}
scale: {x: 100, y: 100, z: 100}
namedPoseList:
- name: Default
skeleton: []
armTwist: 0.5
foreArmTwist: 0.5
upperLegTwist: 0.5
@@ -529,6 +613,7 @@ ModelImporter:
feetSpacing: 0
globalScale: 1
rootMotionBoneName:
defaultPoseIndex: -1
hasTranslationDoF: 0
hasExtraRoot: 1
skeletonHasParents: 1
+99 -7
View File
@@ -124,6 +124,18 @@ NavMeshSettings:
debug:
m_Flags: 0
m_NavMeshData: {fileID: 0}
--- !u!134 &14211372
PhysicMaterial:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
dynamicFriction: 0.6
staticFriction: 0.6
bounciness: 0
frictionCombine: 0
bounceCombine: 0
--- !u!1 &46311543
GameObject:
m_ObjectHideFlags: 0
@@ -224,6 +236,10 @@ MeshRenderer:
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_virtualGeometry: 0
m_ShadingRate: 0
m_ForceDisableGRD: 0
m_ForceDisableSmallMeshCull: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
@@ -249,6 +265,7 @@ MeshRenderer:
m_SortingLayer: 0
m_SortingOrder: 0
m_AdditionalVertexStreams: {fileID: 0}
m_MaskInteraction: 0
--- !u!65 &49968544
BoxCollider:
m_ObjectHideFlags: 0
@@ -330,6 +347,10 @@ MeshRenderer:
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_virtualGeometry: 0
m_ShadingRate: 0
m_ForceDisableGRD: 0
m_ForceDisableSmallMeshCull: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
@@ -355,6 +376,7 @@ MeshRenderer:
m_SortingLayer: 0
m_SortingOrder: 0
m_AdditionalVertexStreams: {fileID: 0}
m_MaskInteraction: 0
--- !u!65 &52985826
BoxCollider:
m_ObjectHideFlags: 0
@@ -436,6 +458,10 @@ MeshRenderer:
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_virtualGeometry: 0
m_ShadingRate: 0
m_ForceDisableGRD: 0
m_ForceDisableSmallMeshCull: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
@@ -461,6 +487,7 @@ MeshRenderer:
m_SortingLayer: 0
m_SortingOrder: 0
m_AdditionalVertexStreams: {fileID: 0}
m_MaskInteraction: 0
--- !u!65 &191484261
BoxCollider:
m_ObjectHideFlags: 0
@@ -623,6 +650,10 @@ MeshRenderer:
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_virtualGeometry: 0
m_ShadingRate: 0
m_ForceDisableGRD: 0
m_ForceDisableSmallMeshCull: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
@@ -648,6 +679,7 @@ MeshRenderer:
m_SortingLayer: 0
m_SortingOrder: 0
m_AdditionalVertexStreams: {fileID: 0}
m_MaskInteraction: 0
--- !u!65 &348061408
BoxCollider:
m_ObjectHideFlags: 0
@@ -729,6 +761,10 @@ MeshRenderer:
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_virtualGeometry: 0
m_ShadingRate: 0
m_ForceDisableGRD: 0
m_ForceDisableSmallMeshCull: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
@@ -754,6 +790,7 @@ MeshRenderer:
m_SortingLayer: 0
m_SortingOrder: 0
m_AdditionalVertexStreams: {fileID: 0}
m_MaskInteraction: 0
--- !u!65 &418321635
BoxCollider:
m_ObjectHideFlags: 0
@@ -835,6 +872,10 @@ MeshRenderer:
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_virtualGeometry: 0
m_ShadingRate: 0
m_ForceDisableGRD: 0
m_ForceDisableSmallMeshCull: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
@@ -860,6 +901,7 @@ MeshRenderer:
m_SortingLayer: 0
m_SortingOrder: 0
m_AdditionalVertexStreams: {fileID: 0}
m_MaskInteraction: 0
--- !u!65 &447055820
BoxCollider:
m_ObjectHideFlags: 0
@@ -1037,6 +1079,10 @@ MeshRenderer:
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_virtualGeometry: 0
m_ShadingRate: 0
m_ForceDisableGRD: 0
m_ForceDisableSmallMeshCull: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
@@ -1062,6 +1108,7 @@ MeshRenderer:
m_SortingLayer: 0
m_SortingOrder: 0
m_AdditionalVertexStreams: {fileID: 0}
m_MaskInteraction: 0
--- !u!65 &934208703
BoxCollider:
m_ObjectHideFlags: 0
@@ -1254,6 +1301,10 @@ MeshRenderer:
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_virtualGeometry: 0
m_ShadingRate: 0
m_ForceDisableGRD: 0
m_ForceDisableSmallMeshCull: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
@@ -1279,6 +1330,7 @@ MeshRenderer:
m_SortingLayer: 0
m_SortingOrder: 0
m_AdditionalVertexStreams: {fileID: 0}
m_MaskInteraction: 0
--- !u!65 &986073235
BoxCollider:
m_ObjectHideFlags: 0
@@ -1324,12 +1376,12 @@ PrefabInstance:
- target: {fileID: -8679921383154817045, guid: aedf6e849dd924e229c57640f99ff50a,
type: 3}
propertyPath: m_LocalPosition.y
value: -0.0000009536743
value: 0.1
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: aedf6e849dd924e229c57640f99ff50a,
type: 3}
propertyPath: m_LocalPosition.z
value: -1.429
value: 0
objectReference: {fileID: 0}
- target: {fileID: -8679921383154817045, guid: aedf6e849dd924e229c57640f99ff50a,
type: 3}
@@ -1403,7 +1455,7 @@ CharacterController:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 989436104}
m_Material: {fileID: 0}
m_Material: {fileID: 14211372}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
@@ -1434,11 +1486,11 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: b91aa6ae607324ce19fc46225a44e70a, type: 3}
m_Name:
m_EditorClassIdentifier:
speed: 5
range: 500
detectRange: 200
speed: 2
range: 30
detectRange: 20
attackRange: 5
target: {fileID: 0}
target: {fileID: 989436104}
--- !u!21 &1122778264
Material:
serializedVersion: 8
@@ -1653,6 +1705,10 @@ MeshRenderer:
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_virtualGeometry: 0
m_ShadingRate: 0
m_ForceDisableGRD: 0
m_ForceDisableSmallMeshCull: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
@@ -1678,6 +1734,7 @@ MeshRenderer:
m_SortingLayer: 0
m_SortingOrder: 0
m_AdditionalVertexStreams: {fileID: 0}
m_MaskInteraction: 0
--- !u!65 &1369034732
BoxCollider:
m_ObjectHideFlags: 0
@@ -1759,6 +1816,10 @@ MeshRenderer:
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_virtualGeometry: 0
m_ShadingRate: 0
m_ForceDisableGRD: 0
m_ForceDisableSmallMeshCull: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
@@ -1784,6 +1845,7 @@ MeshRenderer:
m_SortingLayer: 0
m_SortingOrder: 0
m_AdditionalVertexStreams: {fileID: 0}
m_MaskInteraction: 0
--- !u!65 &1489219292
BoxCollider:
m_ObjectHideFlags: 0
@@ -1865,6 +1927,10 @@ MeshRenderer:
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_virtualGeometry: 0
m_ShadingRate: 0
m_ForceDisableGRD: 0
m_ForceDisableSmallMeshCull: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
@@ -1890,6 +1956,7 @@ MeshRenderer:
m_SortingLayer: 0
m_SortingOrder: 0
m_AdditionalVertexStreams: {fileID: 0}
m_MaskInteraction: 0
--- !u!65 &1517159231
BoxCollider:
m_ObjectHideFlags: 0
@@ -1971,6 +2038,10 @@ MeshRenderer:
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_virtualGeometry: 0
m_ShadingRate: 0
m_ForceDisableGRD: 0
m_ForceDisableSmallMeshCull: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
@@ -1996,6 +2067,7 @@ MeshRenderer:
m_SortingLayer: 0
m_SortingOrder: 0
m_AdditionalVertexStreams: {fileID: 0}
m_MaskInteraction: 0
--- !u!65 &1560522223
BoxCollider:
m_ObjectHideFlags: 0
@@ -2077,6 +2149,10 @@ MeshRenderer:
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_virtualGeometry: 0
m_ShadingRate: 0
m_ForceDisableGRD: 0
m_ForceDisableSmallMeshCull: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
@@ -2102,6 +2178,7 @@ MeshRenderer:
m_SortingLayer: 0
m_SortingOrder: 0
m_AdditionalVertexStreams: {fileID: 0}
m_MaskInteraction: 0
--- !u!65 &1641097996
BoxCollider:
m_ObjectHideFlags: 0
@@ -2183,6 +2260,10 @@ MeshRenderer:
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_virtualGeometry: 0
m_ShadingRate: 0
m_ForceDisableGRD: 0
m_ForceDisableSmallMeshCull: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
@@ -2208,6 +2289,7 @@ MeshRenderer:
m_SortingLayer: 0
m_SortingOrder: 0
m_AdditionalVertexStreams: {fileID: 0}
m_MaskInteraction: 0
--- !u!65 &1692767929
BoxCollider:
m_ObjectHideFlags: 0
@@ -2370,6 +2452,10 @@ MeshRenderer:
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_virtualGeometry: 0
m_ShadingRate: 0
m_ForceDisableGRD: 0
m_ForceDisableSmallMeshCull: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
@@ -2395,6 +2481,7 @@ MeshRenderer:
m_SortingLayer: 0
m_SortingOrder: 0
m_AdditionalVertexStreams: {fileID: 0}
m_MaskInteraction: 0
--- !u!65 &2124957280
BoxCollider:
m_ObjectHideFlags: 0
@@ -2476,6 +2563,10 @@ MeshRenderer:
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_virtualGeometry: 0
m_ShadingRate: 0
m_ForceDisableGRD: 0
m_ForceDisableSmallMeshCull: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
@@ -2501,6 +2592,7 @@ MeshRenderer:
m_SortingLayer: 0
m_SortingOrder: 0
m_AdditionalVertexStreams: {fileID: 0}
m_MaskInteraction: 0
--- !u!65 &2142672092
BoxCollider:
m_ObjectHideFlags: 0
+43 -16
View File
@@ -52,6 +52,7 @@ public class NewBehaviourScript : MonoBehaviour
// Start is called before the first frame update
void Start()
{
@@ -71,21 +72,10 @@ public class NewBehaviourScript : MonoBehaviour
//攻击状态直接返回
if (state == State.Attack)
{
animator.SetInteger("speed", 0);
return;
}
//角色在攻击状态则返回
if (state == State.Alert)
{
//移动
move(targetPos - transform.position);
//到达目标点时候随机目标点
if (Vector3.Distance(transform.position, targetPos) < 0.1f)
{
randomTargetPos();
}
}
//获取侦查范围内除自己以外的Player层的单位
var players = Physics.OverlapSphere(transform.position, detectRange, LayerMask.GetMask("Player"));
//如果存在单位
@@ -110,10 +100,32 @@ public class NewBehaviourScript : MonoBehaviour
{
attack(player);
}
return;
}
}
}
if (state == State.Track)
{
state = State.Alert;
}
//没有侦查到敌人则回到巡逻
state = State.Alert;
//角色在攻击状态则返回
if (state == State.Alert)
{
//移动
move(targetPos - transform.position);
//到达目标点时候随机目标点,只判断水平距离
Vector3 patrolOffset = transform.position - targetPos;
patrolOffset.y = 0;
if (patrolOffset.sqrMagnitude < 0.01f)
{
randomTargetPos();
}
}
}
@@ -121,8 +133,14 @@ public class NewBehaviourScript : MonoBehaviour
private void attack(Collider player)
{
//转向攻击目标
transform.rotation = Quaternion.LookRotation(player.transform.position - transform.position, Vector3.up);
var direction = player.transform.position - transform.position;
direction.y = 0;
if (direction != Vector3.zero)
{
transform.rotation = Quaternion.LookRotation(direction, Vector3.up);
}
//攻击动画动作
animator.SetInteger("speed", 0);
animator.SetTrigger("attack");
state = State.Attack;
}
@@ -134,6 +152,7 @@ public class NewBehaviourScript : MonoBehaviour
//打印
Debug.Log("攻击结束");
state = State.Alert;
randomTargetPos();
}
@@ -141,6 +160,13 @@ public class NewBehaviourScript : MonoBehaviour
//角色移动,持续到目标点
void move(Vector3 movement)
{
movement.y = 0;
if (movement == Vector3.zero)
{
animator.SetInteger("speed", 0);
return;
}
//改变动画控制器的参数
animator.SetInteger("speed", 1);
//向目标点移动
@@ -154,8 +180,9 @@ public class NewBehaviourScript : MonoBehaviour
//随机目标点
private void randomTargetPos()
{
//以startPos为中心,range为半径,y为0的圆形内随机一个点复制到targetPos
targetPos = new Vector3(Random.Range(-range, range), 0, Random.Range(-range, range));
//以startPos为中心,在水平圆形范围内随机一个点
Vector2 randomOffset = Random.insideUnitCircle * range;
targetPos = startPos + new Vector3(randomOffset.x, 0, randomOffset.y);
}
}
+2 -2
View File
@@ -1,7 +1,6 @@
{
"dependencies": {
"cn.tuanjie.ai.generators": "file:../.codely-cli/extensions/TJGenerators/Packages/cn.tuanjie.ai.generators",
"cn.tuanjie.codely.bridge": "1.0.74",
"com.unity.collab-proxy": "2.6.0",
"com.unity.feature.mobile": "1.0.0",
"com.unity.ide.rider": "3.0.36",
@@ -42,6 +41,7 @@
"com.unity.modules.video": "1.0.0",
"com.unity.modules.vr": "1.0.0",
"com.unity.modules.wind": "1.0.0",
"com.unity.modules.xr": "1.0.0"
"com.unity.modules.xr": "1.0.0",
"cn.tuanjie.codely.bridge": "1.0.75"
}
}
+1 -1
View File
@@ -13,7 +13,7 @@
}
},
"cn.tuanjie.codely.bridge": {
"version": "1.0.74",
"version": "1.0.75",
"depth": 0,
"source": "registry",
"dependencies": {
+4 -1
View File
@@ -4,7 +4,10 @@
EditorBuildSettings:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Scenes: []
m_Scenes:
- enabled: 1
path: Assets/Scenes/SampleScene.scene
guid: 7f8a9209e2c654770b6c8311c7e23e18
m_configObjects:
com.unity.adaptiveperformance.simulator.provider_settings: {fileID: 11400000,
guid: b8a7f88d1a5a949a49949bb4bb80f68d, type: 2}