diff --git a/Unity/DifferentialDrive.cs b/Unity/DifferentialDrive.cs index bace623..fe74eb3 100644 --- a/Unity/DifferentialDrive.cs +++ b/Unity/DifferentialDrive.cs @@ -36,14 +36,14 @@ namespace RoboidControl.Unity { rb = gameObj.AddComponent(); rb.isKinematic = false; - rb.mass = 0.5f; + rb.mass = 0.1f; } return component; } private Rigidbody rb = null; - protected virtual void Awake() { + protected virtual void Start() { rb = GetComponent(); } @@ -52,63 +52,47 @@ namespace RoboidControl.Unity { if (coreDrive.wheelRadius <= 0 || coreDrive.wheelSeparation <= 0) return; - // if (leftWheel == null) { - // motors = GetComponentsInChildren(); - // foreach (var motor in motors) { - // if (motor.core.id == coreDrive.leftWheel.id) - // leftWheel = motor; - // } - // if (leftWheel == null) - // // Create placeholder wheel - // leftWheel = Wheel.Create(this.GetComponent(), coreDrive.leftWheel.id); - // } - if (leftWheel != null) { - leftWheel.core ??= coreDrive.leftWheel; - SphereCollider leftWheelCollider = leftWheel.GetComponent(); - leftWheelCollider.radius = coreDrive.wheelRadius; - // leftWheelCollider.center = new Vector3(-coreDrive.wheelSeparation / 2, 0, 0); - } + if (leftWheel == null) + leftWheel = Wheel.Create(this.transform, coreDrive.leftWheel.id); - // if (rightWheel == null) { - // if (motors == null) - // motors = GetComponentsInChildren(); - // foreach (var motor in motors) { - // if (motor.core.id == coreDrive.rightWheel.id) - // rightWheel = motor; - // } - // if (rightWheel == null) - // rightWheel = Wheel.Create(this.GetComponent(), coreDrive.rightWheel.id); - // } - if (rightWheel != null) { - rightWheel.core ??= coreDrive.rightWheel; - SphereCollider rightWheelCollider = rightWheel.GetComponent(); - rightWheelCollider.radius = coreDrive.wheelRadius; - // rightWheelCollider.center = new Vector3(coreDrive.wheelSeparation / 2, 0, 0); - } + leftWheel.core ??= coreDrive.leftWheel; + SphereCollider leftWheelCollider = leftWheel.GetComponent(); + leftWheelCollider.radius = coreDrive.wheelRadius; + // leftWheelCollider.center = new Vector3(-coreDrive.wheelSeparation / 2, 0, 0); + + if (rightWheel == null) + rightWheel = Wheel.Create(this.transform, coreDrive.rightWheel.id); + + rightWheel.core ??= coreDrive.rightWheel; + SphereCollider rightWheelCollider = rightWheel.GetComponent(); + rightWheelCollider.radius = coreDrive.wheelRadius; + // rightWheelCollider.center = new Vector3(coreDrive.wheelSeparation / 2, 0, 0); if (casterWheel == null) { - // Create it - } - if (casterWheel != null) { - casterWheel.radius = coreDrive.wheelRadius; - // Put it in the middle of the back - casterWheel.center = new Vector3(0, 0, -coreDrive.wheelSeparation); + GameObject gameObj = new("Caster wheel"); + gameObj.transform.parent = this.transform; + casterWheel = gameObj.AddComponent(); + casterWheel.material = Wheel.slidingWheel; } + casterWheel.radius = coreDrive.wheelRadius; + // Put it in the middle of the back + casterWheel.center = new Vector3(0, 0, -coreDrive.wheelSeparation); } - protected override void FixedUpdate() { base.FixedUpdate(); - float leftWheelVelocity = leftWheel.rotationSpeed * (2 * Mathf.PI) * coreDrive.wheelRadius; - float rightWheelVelocity = rightWheel.rotationSpeed * (2 * Mathf.PI) * coreDrive.wheelRadius; + if (rb != null && leftWheel != null && rightWheel != null) { + float leftWheelVelocity = leftWheel.rotationSpeed * (2 * Mathf.PI) * coreDrive.wheelRadius; + float rightWheelVelocity = rightWheel.rotationSpeed * (2 * Mathf.PI) * coreDrive.wheelRadius; - float forwardSpeed = (leftWheelVelocity + rightWheelVelocity) / 2f; - float turningSpeed = (leftWheelVelocity - rightWheelVelocity) / coreDrive.wheelSeparation; + float forwardSpeed = (leftWheelVelocity + rightWheelVelocity) / 2f; + float turningSpeed = (leftWheelVelocity - rightWheelVelocity) / coreDrive.wheelSeparation; - // Use smoothing to emulate motor inertia - rb.velocity = 0.9f * rb.velocity + 0.1f * forwardSpeed * transform.forward; - rb.angularVelocity = 0.9f * rb.angularVelocity + 0.1f * turningSpeed * Vector3.up; + // Use smoothing to emulate motor inertia + rb.velocity = 0.9f * rb.velocity + 0.1f * forwardSpeed * transform.forward; + rb.angularVelocity = 0.9f * rb.angularVelocity + 0.1f * turningSpeed * Vector3.up; + } } } diff --git a/Unity/Resources/DifferentialDrive 1.prefab b/Unity/Resources/DifferentialDrive 1.prefab deleted file mode 100644 index 663587f..0000000 --- a/Unity/Resources/DifferentialDrive 1.prefab +++ /dev/null @@ -1,744 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &135949056663158942 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 693610334404048217} - - component: {fileID: 874278397287993211} - - component: {fileID: 8149674613691108646} - - component: {fileID: 7453252590388621785} - m_Layer: 0 - m_Name: Body - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &693610334404048217 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 135949056663158942} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0.01, z: -0.01} - m_LocalScale: {x: 0.15, y: 0.05, z: 0.2} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 6798369561388671537} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!33 &874278397287993211 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 135949056663158942} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &8149674613691108646 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 135949056663158942} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!65 &7453252590388621785 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 135949056663158942} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Size: {x: 1, y: 1, z: 1} - m_Center: {x: -3.4930155e-36, y: 0, z: 0} ---- !u!1 &461568911372928883 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 6614469428499581915} - - component: {fileID: 5740668195873595670} - - component: {fileID: 981938778352350881} - - component: {fileID: 5978480396129778279} - - component: {fileID: 2485026999856066728} - - component: {fileID: 1286794448967865589} - m_Layer: 0 - m_Name: Sphere - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!4 &6614469428499581915 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 461568911372928883} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -0, y: -0.0337, z: -0.0684} - m_LocalScale: {x: 0.02, y: 0.02, z: 0.02} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 213193100111257669} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!33 &5740668195873595670 -MeshFilter: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 461568911372928883} - m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} ---- !u!23 &981938778352350881 -MeshRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 461568911372928883} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!135 &5978480396129778279 -SphereCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 461568911372928883} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Radius: 0.5 - m_Center: {x: 2.2e-44, y: 0, z: 0} ---- !u!54 &2485026999856066728 -Rigidbody: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 461568911372928883} - serializedVersion: 4 - m_Mass: 0.01 - m_Drag: 0 - m_AngularDrag: 0 - m_CenterOfMass: {x: 0, y: 0, z: 0} - m_InertiaTensor: {x: 1, y: 1, z: 1} - m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ImplicitCom: 1 - m_ImplicitTensor: 1 - m_UseGravity: 1 - m_IsKinematic: 0 - m_Interpolate: 0 - m_Constraints: 0 - m_CollisionDetection: 0 ---- !u!59 &1286794448967865589 -HingeJoint: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 461568911372928883} - m_ConnectedBody: {fileID: 4118868690347991998} - m_ConnectedArticulationBody: {fileID: 0} - m_Anchor: {x: 0, y: 0.5, z: 0} - m_Axis: {x: 1, y: 0, z: 0} - m_AutoConfigureConnectedAnchor: 1 - m_ConnectedAnchor: {x: 0, y: -0.019776002, z: -0.0684} - serializedVersion: 2 - m_UseSpring: 0 - m_Spring: - spring: 0 - damper: 0 - targetPosition: 0 - m_UseMotor: 0 - m_Motor: - targetVelocity: 0 - force: 0 - freeSpin: 0 - m_UseLimits: 0 - m_ExtendedLimits: 0 - m_UseAcceleration: 0 - m_Limits: - min: 0 - max: 0 - bounciness: 0 - bounceMinVelocity: 0.2 - contactDistance: 0 - m_BreakForce: Infinity - m_BreakTorque: Infinity - m_EnableCollision: 0 - m_EnablePreprocessing: 1 - m_MassScale: 1 - m_ConnectedMassScale: 1 ---- !u!1 &3154420579555598162 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 213193100111257669} - - component: {fileID: 7200410571604616845} - - component: {fileID: 894333789048616995} - m_Layer: 0 - m_Name: Caster wheel - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &213193100111257669 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3154420579555598162} - serializedVersion: 2 - m_LocalRotation: {x: -0, y: -0, z: 7e-45, w: 1} - m_LocalPosition: {x: 0, y: 0.0039239973, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 6614469428499581915} - m_Father: {fileID: 6798369561388671537} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!146 &7200410571604616845 -WheelCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3154420579555598162} - serializedVersion: 2 - m_Center: {x: 0, y: 0, z: -0.1} - m_Radius: 0.1 - m_SuspensionSpring: - spring: 0 - damper: 0 - targetPosition: 0.5 - m_SuspensionDistance: 0.01 - m_ForceAppPointDistance: 0 - m_Mass: 0.1 - m_WheelDampingRate: 0.25 - m_ForwardFriction: - m_ExtremumSlip: 0.01 - m_ExtremumValue: 0.01 - m_AsymptoteSlip: 1 - m_AsymptoteValue: 0.01 - m_Stiffness: 0.01 - m_SidewaysFriction: - m_ExtremumSlip: 0.01 - m_ExtremumValue: 0.01 - m_AsymptoteSlip: 1 - m_AsymptoteValue: 0.01 - m_Stiffness: 0.01 - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_Enabled: 0 - m_ProvidesContacts: 0 ---- !u!135 &894333789048616995 -SphereCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3154420579555598162} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Radius: 0.1 - m_Center: {x: 0, y: 0, z: -0.1} ---- !u!1 &3377575892836316963 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 7997617267105515189} - - component: {fileID: 3291281099104606017} - - component: {fileID: 6773972788910618332} - - component: {fileID: 3720747953092717687} - m_Layer: 0 - m_Name: Left wheel - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &7997617267105515189 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3377575892836316963} - serializedVersion: 2 - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0.003924, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 6798369561388671537} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!146 &3291281099104606017 -WheelCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3377575892836316963} - serializedVersion: 2 - m_Center: {x: -0.1, y: 0, z: 0} - m_Radius: 0.1 - m_SuspensionSpring: - spring: 0 - damper: 0 - targetPosition: 0.5 - m_SuspensionDistance: 0.01 - m_ForceAppPointDistance: 0 - m_Mass: 0.1 - m_WheelDampingRate: 0.25 - m_ForwardFriction: - m_ExtremumSlip: 0.4 - m_ExtremumValue: 1 - m_AsymptoteSlip: 0.8 - m_AsymptoteValue: 0.5 - m_Stiffness: 1 - m_SidewaysFriction: - m_ExtremumSlip: 0.2 - m_ExtremumValue: 1 - m_AsymptoteSlip: 0.5 - m_AsymptoteValue: 0.75 - m_Stiffness: 1 - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_Enabled: 0 - m_ProvidesContacts: 0 ---- !u!114 &6773972788910618332 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3377575892836316963} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: ddd5065d5e866894cbcb569c3a898ccb, type: 3} - m_Name: - m_EditorClassIdentifier: - participant: {fileID: 0} - rotationSpeed: 0 - wheelCollider: {fileID: 3291281099104606017} ---- !u!135 &3720747953092717687 -SphereCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3377575892836316963} - m_Material: {fileID: 13400000, guid: 6311a2373d42743449d6eb1130ee618a, type: 2} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Radius: 0.1 - m_Center: {x: -0.1, y: 0, z: 0} ---- !u!1 &4326386140118987503 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 6798369561388671537} - - component: {fileID: 2975045340952151157} - - component: {fileID: 4118868690347991998} - m_Layer: 0 - m_Name: DifferentialDrive 1 - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &6798369561388671537 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4326386140118987503} - serializedVersion: 2 - m_LocalRotation: {x: 1.276433e-21, y: -1.082074e-19, z: -2.3980766e-36, w: 1} - m_LocalPosition: {x: 2.1932227e-37, y: -0.06941543, z: -1.3084181e-19} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 7997617267105515189} - - {fileID: 2660791421672615984} - - {fileID: 693610334404048217} - - {fileID: 213193100111257669} - - {fileID: 4266196581235677096} - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &2975045340952151157 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4326386140118987503} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5c80bc2fd1d8aa14facb1ad4b6ccf7b3, type: 3} - m_Name: - m_EditorClassIdentifier: - participant: {fileID: 0} - leftWheel: {fileID: 6773972788910618332} - rightWheel: {fileID: 7425139233737877139} - casterWheel: {fileID: 894333789048616995} ---- !u!54 &4118868690347991998 -Rigidbody: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4326386140118987503} - serializedVersion: 4 - m_Mass: 0.1 - m_Drag: 0 - m_AngularDrag: 0.05 - m_CenterOfMass: {x: 0, y: 0, z: 0} - m_InertiaTensor: {x: 1, y: 1, z: 1} - m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ImplicitCom: 1 - m_ImplicitTensor: 1 - m_UseGravity: 1 - m_IsKinematic: 0 - m_Interpolate: 0 - m_Constraints: 0 - m_CollisionDetection: 0 ---- !u!1 &5122915782100933114 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2660791421672615984} - - component: {fileID: 5992237647142430322} - - component: {fileID: 7425139233737877139} - - component: {fileID: 8150853676422519226} - m_Layer: 0 - m_Name: Right wheel - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &2660791421672615984 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5122915782100933114} - serializedVersion: 2 - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0.003924, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 6798369561388671537} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!146 &5992237647142430322 -WheelCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5122915782100933114} - serializedVersion: 2 - m_Center: {x: 0.1, y: 0, z: 0} - m_Radius: 0.1 - m_SuspensionSpring: - spring: 0 - damper: 0 - targetPosition: 0.5 - m_SuspensionDistance: 0.01 - m_ForceAppPointDistance: 0 - m_Mass: 0.1 - m_WheelDampingRate: 0.25 - m_ForwardFriction: - m_ExtremumSlip: 0.4 - m_ExtremumValue: 1 - m_AsymptoteSlip: 0.8 - m_AsymptoteValue: 0.5 - m_Stiffness: 1 - m_SidewaysFriction: - m_ExtremumSlip: 0.2 - m_ExtremumValue: 1 - m_AsymptoteSlip: 0.5 - m_AsymptoteValue: 0.75 - m_Stiffness: 1 - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_Enabled: 0 - m_ProvidesContacts: 0 ---- !u!114 &7425139233737877139 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5122915782100933114} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: ddd5065d5e866894cbcb569c3a898ccb, type: 3} - m_Name: - m_EditorClassIdentifier: - participant: {fileID: 0} - rotationSpeed: 0 - wheelCollider: {fileID: 5992237647142430322} ---- !u!135 &8150853676422519226 -SphereCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5122915782100933114} - m_Material: {fileID: 13400000, guid: 6311a2373d42743449d6eb1130ee618a, type: 2} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Radius: 0.1 - m_Center: {x: 0.1, y: 0, z: 0} ---- !u!1 &9198376257167485667 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 4266196581235677096} - - component: {fileID: 3529432273103841021} - m_Layer: 0 - m_Name: Front Caster wheel - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!4 &4266196581235677096 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 9198376257167485667} - serializedVersion: 2 - m_LocalRotation: {x: -0, y: -0, z: 7e-45, w: 1} - m_LocalPosition: {x: 0, y: 0.0039239973, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 6798369561388671537} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!146 &3529432273103841021 -WheelCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 9198376257167485667} - serializedVersion: 2 - m_Center: {x: 0, y: 0, z: 0.1} - m_Radius: 0.1 - m_SuspensionSpring: - spring: 100 - damper: 10 - targetPosition: 0.5 - m_SuspensionDistance: 0.01 - m_ForceAppPointDistance: 0 - m_Mass: 0.1 - m_WheelDampingRate: 0.25 - m_ForwardFriction: - m_ExtremumSlip: 0.01 - m_ExtremumValue: 0.01 - m_AsymptoteSlip: 1 - m_AsymptoteValue: 0.01 - m_Stiffness: 0.01 - m_SidewaysFriction: - m_ExtremumSlip: 0.01 - m_ExtremumValue: 0.01 - m_AsymptoteSlip: 1 - m_AsymptoteValue: 0.01 - m_Stiffness: 0.01 - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_Enabled: 0 - m_ProvidesContacts: 0 diff --git a/Unity/Resources/DifferentialDrive.prefab b/Unity/Resources/DifferentialDrive_disabled.prefab similarity index 99% rename from Unity/Resources/DifferentialDrive.prefab rename to Unity/Resources/DifferentialDrive_disabled.prefab index efcee2e..3f5f12d 100644 --- a/Unity/Resources/DifferentialDrive.prefab +++ b/Unity/Resources/DifferentialDrive_disabled.prefab @@ -240,7 +240,7 @@ GameObject: - component: {fileID: 2975045340952151157} - component: {fileID: 4118868690347991998} m_Layer: 0 - m_Name: DifferentialDrive + m_Name: DifferentialDrive_disabled m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 diff --git a/Unity/Resources/SlidingWheel.physicMaterial b/Unity/Resources/SlidingWheel.physicMaterial new file mode 100644 index 0000000..bb7a6f9 --- /dev/null +++ b/Unity/Resources/SlidingWheel.physicMaterial @@ -0,0 +1,14 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!134 &13400000 +PhysicMaterial: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: SlidingWheel + dynamicFriction: 0.02 + staticFriction: 0.01 + bounciness: 0 + frictionCombine: 1 + bounceCombine: 0 diff --git a/Unity/Wheel.cs b/Unity/Wheel.cs index 1feefef..d68b9b6 100644 --- a/Unity/Wheel.cs +++ b/Unity/Wheel.cs @@ -35,7 +35,7 @@ namespace RoboidControl.Unity { return component; } } - public static Wheel Create(Rigidbody rb, byte thingId) { + public static Wheel Create(Transform parent, byte thingId) { GameObject prefab = (GameObject)Resources.Load("Wheel"); if (prefab != null) { // Use resource prefab when available @@ -48,16 +48,19 @@ namespace RoboidControl.Unity { else { // Fallback implementation GameObject gameObj = new("Wheel"); - gameObj.transform.parent = rb.transform; + gameObj.transform.parent = parent; Wheel component = gameObj.AddComponent(); SiteServer participant = FindAnyObjectByType(); RoboidControl.Thing core = participant.coreParticipant.Get(thingId); if (core == null) core = new(participant.coreParticipant, RoboidControl.Thing.Type.UncontrolledMotor, thingId, false); else { -; + ; } component.Init(core); + SphereCollider collider = gameObj.AddComponent(); + collider.radius = 0.00001f; + collider.material = slidingWheel; // component.wheelCollider = gameObj.AddComponent(); // component.wheelCollider.mass = 0.1f; // component.wheelCollider.suspensionDistance = 0.01f; @@ -71,6 +74,24 @@ namespace RoboidControl.Unity { } } + private static PhysicMaterial _slidingWheel; + public static PhysicMaterial slidingWheel { + get { + if (_slidingWheel == null) { + _slidingWheel = new() { + dynamicFriction = 0.02f, // Dynamic friction + staticFriction = 0.01f, // Static friction + bounciness = 0f, // Bounciness (bounciness value between 0 and 1) + + // Set the friction combine and bounce combine methods + frictionCombine = PhysicMaterialCombine.Minimum, // How to combine friction + bounceCombine = PhysicMaterialCombine.Average // How to combine bounciness + }; + } + return _slidingWheel; + } + } + } } #endif \ No newline at end of file