diff --git a/Examples/BB2B/BB2B.cs b/Examples/BB2B/BB2B.cs index a5251fd..bc7aa66 100644 --- a/Examples/BB2B/BB2B.cs +++ b/Examples/BB2B/BB2B.cs @@ -7,6 +7,7 @@ namespace RoboidControl { readonly DifferentialDrive drive; readonly TouchSensor touchLeft; readonly TouchSensor touchRight; + const float speed = 0.5f; public BB2B(Participant owner) : base(owner) { this.name = "BB2B"; @@ -29,11 +30,11 @@ namespace RoboidControl { // The left wheel turns forward when nothing is touched on the right side // and turn backward when the roboid hits something on the right - float leftWheelSpeed = touchRight.touchedSomething ? -0.1f : 0.1f; + float leftWheelSpeed = touchRight.touchedSomething ? -speed : speed; // The right wheel does the same, but instead is controlled by // touches on the left side - float rightWheelSpeed = touchLeft.touchedSomething ? -0.1f : 0.1f; + float rightWheelSpeed = touchLeft.touchedSomething ? -speed : speed; // When both sides are touching something, both wheels will turn backward // and the roboid will move backwards diff --git a/Unity/DifferentialDrive.cs b/Unity/DifferentialDrive.cs index 5977740..bace623 100644 --- a/Unity/DifferentialDrive.cs +++ b/Unity/DifferentialDrive.cs @@ -6,6 +6,9 @@ namespace RoboidControl.Unity { public Wheel leftWheel; public Wheel rightWheel; + public SphereCollider casterWheel; + + protected RoboidControl.DifferentialDrive coreDrive => core as RoboidControl.DifferentialDrive; /// /// Create the Unity representation @@ -13,65 +16,99 @@ namespace RoboidControl.Unity { /// The core touch sensor /// The Unity representation of the touch sensor public static DifferentialDrive Create(RoboidControl.DifferentialDrive core) { + DifferentialDrive component = null; + Rigidbody rb = null; GameObject prefab = (GameObject)Resources.Load("DifferentialDrive"); - // if (prefab != null) { - // // Use resource prefab when available - // GameObject gameObj = Instantiate(prefab); - // DifferentialDrive component = gameObj.GetComponent(); - // if (component != null) - // component.core = core; - // return component; - // } - // else { - // Fallback implementation - GameObject gameObj = new(core.name); - DifferentialDrive component = gameObj.AddComponent(); - component.Init(core); + if (prefab != null) { + // Use resource prefab when available + GameObject gameObj = Instantiate(prefab); + component = gameObj.GetComponent(); + if (component != null) + component.core = core; - Rigidbody rb = gameObj.AddComponent(); - rb.isKinematic = false; - rb.mass = 0.5f; + rb = component.GetComponent(); + } + else { + // Fallback implementation + GameObject gameObj = new(core.name); + component = gameObj.AddComponent(); + component.Init(core); + + rb = gameObj.AddComponent(); + rb.isKinematic = false; + rb.mass = 0.5f; + } return component; - // } + } + + private Rigidbody rb = null; + + protected virtual void Awake() { + rb = GetComponent(); } protected override void HandleBinary() { Debug.Log("Diff drive handle Binary"); - RoboidControl.DifferentialDrive coreDrive = core as RoboidControl.DifferentialDrive; - RoboidControl.Unity.Wheel[] motors = null; 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) - leftWheel = Wheel.Create(this.GetComponent(), coreDrive.leftWheel.id); - } + // 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.wheelCollider.radius = coreDrive.wheelRadius; - leftWheel.wheelCollider.center = new Vector3(-coreDrive.wheelSeparation / 2, 0, 0); - leftWheel.transform.position = Vector3.zero; // position is done with the center, but only X direction is supported right now... + leftWheel.core ??= coreDrive.leftWheel; + SphereCollider leftWheelCollider = leftWheel.GetComponent(); + leftWheelCollider.radius = coreDrive.wheelRadius; + // leftWheelCollider.center = new Vector3(-coreDrive.wheelSeparation / 2, 0, 0); } - 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) { + // 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); } - if (rightWheel != null && coreDrive.wheelRadius > 0 && coreDrive.wheelSeparation > 0) { - rightWheel.wheelCollider.radius = coreDrive.wheelRadius; - rightWheel.wheelCollider.center = new Vector3(coreDrive.wheelSeparation / 2, 0, 0); - rightWheel.transform.position = Vector3.zero; // position is done with the center, but only X direction is supported right now... + + 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); + } + } + + + protected override void FixedUpdate() { + base.FixedUpdate(); + + 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; + + // 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/Motor.cs b/Unity/Motor.cs index 6b2b4f3..9995cee 100644 --- a/Unity/Motor.cs +++ b/Unity/Motor.cs @@ -3,6 +3,8 @@ using UnityEngine; namespace RoboidControl.Unity { public class Motor : Thing { + + public float maxSpeed = 5; /// /// Create the Unity representation /// @@ -34,15 +36,15 @@ namespace RoboidControl.Unity { protected override void HandleBinary() { RoboidControl.Motor coreMotor = core as RoboidControl.Motor; - this.rotationSpeed = coreMotor.targetSpeed; + this.rotationSpeed = coreMotor.targetSpeed * maxSpeed; } protected override void Update() { base.Update(); // We rotate the first child of the motor, which should be the axle. - if (this.transform.childCount > 0) { - this.transform.GetChild(0).Rotate(360 * this.rotationSpeed, 0, 0); - } + float rotation = 360 * this.rotationSpeed * Time.deltaTime; + if (this.transform.childCount > 0) + this.transform.GetChild(0).Rotate(rotation, 0, 0); } } } diff --git a/Unity/Resources/DifferentialDrive 1.prefab b/Unity/Resources/DifferentialDrive 1.prefab new file mode 100644 index 0000000..663587f --- /dev/null +++ b/Unity/Resources/DifferentialDrive 1.prefab @@ -0,0 +1,744 @@ +%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.prefab index 10a99be..efcee2e 100644 --- a/Unity/Resources/DifferentialDrive.prefab +++ b/Unity/Resources/DifferentialDrive.prefab @@ -11,6 +11,7 @@ GameObject: - component: {fileID: 693610334404048217} - component: {fileID: 874278397287993211} - component: {fileID: 8149674613691108646} + - component: {fileID: 7453252590388621785} m_Layer: 0 m_Name: Body m_TagString: Untagged @@ -27,8 +28,8 @@ Transform: m_GameObject: {fileID: 135949056663158942} serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0.15, y: 0.05, z: 0.2} + m_LocalPosition: {x: 0, y: 0.01, z: -0.01} + m_LocalScale: {x: 0.12, y: 0.05, z: 0.2} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 6798369561388671537} @@ -83,6 +84,80 @@ MeshRenderer: 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: 0 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: -3.4930155e-36, y: 0, z: 0} +--- !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: 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, z: -0.1} + 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!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: 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.00001 + m_Center: {x: 0, y: 0, z: 0} --- !u!1 &3377575892836316963 GameObject: m_ObjectHideFlags: 0 @@ -92,7 +167,8 @@ GameObject: 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 @@ -109,42 +185,36 @@ Transform: 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_LocalPosition: {x: -0.08, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 - m_Children: [] + m_Children: + - {fileID: 9144497505704104684} m_Father: {fileID: 6798369561388671537} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!146 &3291281099104606017 -WheelCollider: +--- !u!114 &6773972788910618332 +MonoBehaviour: 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: 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.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_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ddd5065d5e866894cbcb569c3a898ccb, type: 3} + m_Name: + m_EditorClassIdentifier: + participant: {fileID: 0} + maxSpeed: 5 + rotationSpeed: 0 +--- !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 @@ -152,8 +222,12 @@ WheelCollider: serializedVersion: 2 m_Bits: 0 m_LayerOverridePriority: 0 - m_Enabled: 1 + m_IsTrigger: 0 m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Radius: 0.00001 + m_Center: {x: 0, y: 0, z: 0} --- !u!1 &4326386140118987503 GameObject: m_ObjectHideFlags: 0 @@ -188,6 +262,7 @@ Transform: - {fileID: 7997617267105515189} - {fileID: 2660791421672615984} - {fileID: 693610334404048217} + - {fileID: 213193100111257669} m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &2975045340952151157 @@ -202,19 +277,10 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 5c80bc2fd1d8aa14facb1ad4b6ccf7b3, type: 3} m_Name: m_EditorClassIdentifier: - k__BackingField: - terminate: 0 - id: 1 - type: 13 - nameChanged: 1 - hierarchyChanged: 1 - positionUpdated: 0 - orientationUpdated: 0 - linearVelocityUpdated: 0 - angularVelocityUpdated: 0 participant: {fileID: 0} - leftWheel: {fileID: 3291281099104606017} - rightWheel: {fileID: 5992237647142430322} + leftWheel: {fileID: 6773972788910618332} + rightWheel: {fileID: 7425139233737877139} + casterWheel: {fileID: 894333789048616995} --- !u!54 &4118868690347991998 Rigidbody: m_ObjectHideFlags: 0 @@ -223,7 +289,7 @@ Rigidbody: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 4326386140118987503} serializedVersion: 4 - m_Mass: 0.5 + m_Mass: 0.1 m_Drag: 0 m_AngularDrag: 0.05 m_CenterOfMass: {x: 0, y: 0, z: 0} @@ -242,6 +308,89 @@ Rigidbody: m_Interpolate: 0 m_Constraints: 0 m_CollisionDetection: 0 +--- !u!1 &4927629757198460283 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 9144497505704104684} + - component: {fileID: 8353236605004633556} + - component: {fileID: 1652944855748388758} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &9144497505704104684 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4927629757198460283} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.01, y: 0.05, z: 0.05} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 7997617267105515189} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &8353236605004633556 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4927629757198460283} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &1652944855748388758 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4927629757198460283} + 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: 2100000, guid: c83c86eecb501964d9e4fd4074683016, type: 2} + 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!1 &5122915782100933114 GameObject: m_ObjectHideFlags: 0 @@ -251,7 +400,8 @@ GameObject: 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 @@ -268,42 +418,36 @@ Transform: 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_LocalPosition: {x: 0.08, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 - m_Children: [] + m_Children: + - {fileID: 2324127387642107303} m_Father: {fileID: 6798369561388671537} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!146 &5992237647142430322 -WheelCollider: +--- !u!114 &7425139233737877139 +MonoBehaviour: 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: 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.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_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ddd5065d5e866894cbcb569c3a898ccb, type: 3} + m_Name: + m_EditorClassIdentifier: + participant: {fileID: 0} + maxSpeed: 5 + rotationSpeed: 0 +--- !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 @@ -311,5 +455,92 @@ WheelCollider: serializedVersion: 2 m_Bits: 0 m_LayerOverridePriority: 0 - m_Enabled: 1 + m_IsTrigger: 0 m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Radius: 0.00001 + m_Center: {x: 0, y: 0, z: 0} +--- !u!1 &5663058822615269368 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2324127387642107303} + - component: {fileID: 7927909525546489266} + - component: {fileID: 1038362976985791207} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2324127387642107303 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5663058822615269368} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: 7e-45, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.01, y: 0.049999997, z: 0.049999997} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2660791421672615984} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &7927909525546489266 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5663058822615269368} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &1038362976985791207 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5663058822615269368} + 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: 2100000, guid: c83c86eecb501964d9e4fd4074683016, type: 2} + 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} diff --git a/Unity/Thing.cs b/Unity/Thing.cs index 5369589..423a4b4 100644 --- a/Unity/Thing.cs +++ b/Unity/Thing.cs @@ -13,7 +13,7 @@ namespace RoboidControl.Unity { /// /// The core C# thing /// - [field: SerializeField] + //[field: SerializeField] public RoboidControl.Thing core { get; set; } public SiteServer participant; @@ -65,7 +65,8 @@ namespace RoboidControl.Unity { /// Update the Unity representation /// protected virtual void Update() { - UpdateThing(); + if (core == null) + return; if (core.linearVelocity != null && core.linearVelocity.distance != 0) { Vector3 direction = Quaternion.AngleAxis(core.linearVelocity.direction.horizontal, Vector3.up) * Vector3.forward; @@ -78,9 +79,13 @@ namespace RoboidControl.Unity { } } + protected virtual void FixedUpdate() { + UpdateThing(); + } + public void UpdateThing() { if (core == null) { - // Debug.Log("Core thing is gone, self destruct in 0 seconds..."); + Debug.Log($"{this} core thing is gone, self destruct in 0 seconds..."); Destroy(this); return; } diff --git a/Unity/Wheel.cs b/Unity/Wheel.cs index 530737c..1feefef 100644 --- a/Unity/Wheel.cs +++ b/Unity/Wheel.cs @@ -23,14 +23,14 @@ namespace RoboidControl.Unity { GameObject gameObj = new(core.name); Wheel component = gameObj.AddComponent(); component.Init(core); - component.wheelCollider = gameObj.AddComponent(); - component.wheelCollider.mass = 0.1f; - component.wheelCollider.suspensionDistance = 0.01f; - component.wheelCollider.suspensionSpring = new JointSpring { - spring = 100f, // Very high spring value to make it rigid - damper = 10f, // Low damping (could be adjusted for slight 'bounciness') - targetPosition = 0.5f // Neutral position (middle of the suspension travel) - }; + // component.wheelCollider = gameObj.AddComponent(); + // component.wheelCollider.mass = 0.1f; + // component.wheelCollider.suspensionDistance = 0.01f; + // component.wheelCollider.suspensionSpring = new JointSpring { + // spring = 100f, // Very high spring value to make it rigid + // damper = 10f, // Low damping (could be adjusted for slight 'bounciness') + // targetPosition = 0.5f // Neutral position (middle of the suspension travel) + // }; Debug.Log("Create " + core.name); return component; } @@ -58,39 +58,19 @@ namespace RoboidControl.Unity { ; } component.Init(core); - component.wheelCollider = gameObj.AddComponent(); - component.wheelCollider.mass = 0.1f; - component.wheelCollider.suspensionDistance = 0.01f; - component.wheelCollider.suspensionSpring = new JointSpring { - spring = 100f, // Very high spring value to make it rigid - damper = 10f, // Low damping (could be adjusted for slight 'bounciness') - targetPosition = 0.5f // Neutral position (middle of the suspension travel) - }; + // component.wheelCollider = gameObj.AddComponent(); + // component.wheelCollider.mass = 0.1f; + // component.wheelCollider.suspensionDistance = 0.01f; + // component.wheelCollider.suspensionSpring = new JointSpring { + // spring = 100f, // Very high spring value to make it rigid + // damper = 10f, // Low damping (could be adjusted for slight 'bounciness') + // targetPosition = 0.5f // Neutral position (middle of the suspension travel) + // }; Debug.Log("Create placeholder Wheel "); return component; } } - public WheelCollider wheelCollider; - - protected override void HandlePose() { - this.wheelCollider.center = core.position.ToVector3(); - this.transform.position = Vector3.zero; // position is done with the center - } - - protected override void Update() { - UpdateThing(); - - if (wheelCollider.radius > 0) { - float targetRotationSpeed = this.rotationSpeed * 2 * Mathf.PI; // 1 rotation per second in radians - - // Calculate the required motor torque - float requiredTorque = (targetRotationSpeed * wheelCollider.mass) / wheelCollider.radius; - - // Set the motor torque - wheelCollider.motorTorque = requiredTorque; - } - } } } #endif \ No newline at end of file