diff --git a/Examples/BB2B/BB2B.cs b/Examples/BB2B/BB2B.cs index 6462486..38fa78f 100644 --- a/Examples/BB2B/BB2B.cs +++ b/Examples/BB2B/BB2B.cs @@ -1,4 +1,5 @@ - +using LinearAlgebra; + namespace RoboidControl { // The robot is based on a differential drive @@ -13,9 +14,14 @@ namespace RoboidControl { this.wheelSeparation = 0.128f; // Is has a touch sensor at the front left of the roboid - touchLeft = new(this); - // and other one on the right - touchRight = new(this); + touchLeft = new(this) { + position = Spherical.Degrees(0.12f, -30, 0), + orientation = new SwingTwist(-30, 0, 0) + }; + touchRight = new(this) { + position = Spherical.Degrees(0.12f, 30, 0), + orientation = new SwingTwist(30, 0, 0) + }; } public override void Update(ulong currentTimeMs, bool recurse = true) { diff --git a/Unity/DifferentialDrive.cs b/Unity/DifferentialDrive.cs index c98c66c..3e669ad 100644 --- a/Unity/DifferentialDrive.cs +++ b/Unity/DifferentialDrive.cs @@ -14,19 +14,30 @@ namespace RoboidControl.Unity { /// The core touch sensor /// The Unity representation of the touch sensor public static DifferentialDrive Create(RoboidControl.DifferentialDrive core) { - GameObject gameObj = new(core.name); - DifferentialDrive component = gameObj.AddComponent(); - component.Init(core); + 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); - Rigidbody rb = gameObj.AddComponent(); - rb.isKinematic = false; - rb.mass = 0.5f; - - return component; + Rigidbody rb = gameObj.AddComponent(); + rb.isKinematic = false; + rb.mass = 0.5f; + return component; + } } protected override void HandleBinary() { - RoboidControl.DifferentialDrive drive = core as RoboidControl.DifferentialDrive; + RoboidControl.DifferentialDrive coreDrive = core as RoboidControl.DifferentialDrive; if (leftWheel == null) { GameObject leftWheelObj = new GameObject("Left wheel"); leftWheelObj.transform.SetParent(this.transform); @@ -34,73 +45,27 @@ namespace RoboidControl.Unity { leftWheel.mass = 0.1f; leftWheel.suspensionDistance = 0.01f; leftWheel.suspensionSpring = new JointSpring { - spring = 1000f, // Very high spring value to make it rigid - damper = 100f, // Low damping (could be adjusted for slight 'bounciness') + 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) }; - leftWheel.radius = drive.wheelRadius; - leftWheel.center = new Vector3(-drive.wheelSeparation / 2, 0, 0); } + leftWheel.radius = coreDrive.wheelRadius; + leftWheel.center = new Vector3(-coreDrive.wheelSeparation / 2, 0, 0); if (rightWheel == null) { - GameObject rightWheelObj = new GameObject("Left wheel"); + GameObject rightWheelObj = new GameObject("Right wheel"); rightWheelObj.transform.SetParent(this.transform); rightWheel = rightWheelObj.AddComponent(); rightWheel.mass = 0.1f; rightWheel.suspensionDistance = 0.01f; rightWheel.suspensionSpring = new JointSpring { - spring = 1000f, // Very high spring value to make it rigid - damper = 100f, // Low damping (could be adjusted for slight 'bounciness') + 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) }; - rightWheel.radius = drive.wheelRadius; - rightWheel.center = new Vector3(drive.wheelSeparation / 2, 0, 0); - } - // Thing[] children = this.GetComponentsInChildren(); - // if (leftWheel == null) { - // leftWheel = children.FirstOrDefault(child => child.core.id == drive.leftWheel.id); - // if (leftWheel == null) { - // RoboidControl.Thing coreThing = new(drive.owner, 0, drive.leftWheel.id, false) { - // name = "Left Wheel" - // }; - // leftWheel = Thing.Create(coreThing); - // leftWheel.transform.SetParent(this.transform); - // } - // WheelCollider wheel = this.GetComponent(); - // if (wheel == null) - // wheel = this.gameObject.AddComponent(); - // wheel.mass = 0.1f; - // wheel.suspensionDistance = 0.01f; - // wheel.suspensionSpring = new JointSpring { - // spring = 1000f, // Very high spring value to make it rigid - // damper = 100f, // Low damping (could be adjusted for slight 'bounciness') - // targetPosition = 0.5f // Neutral position (middle of the suspension travel) - // }; - // wheel.radius = drive.wheelRadius; - // wheel.center = new Vector3(-drive.wheelSeparation / 2, 0, 0); - // } - // if (rightWheel == null) { - // this.rightWheel = children.FirstOrDefault(child => child.core.id == drive.rightWheel.id); - // if (this.rightWheel == null) { - // RoboidControl.Thing coreThing = new(drive.owner, 0, drive.rightWheel.id, false) { - // name = "Right Wheel" - // }; - // this.rightWheel = Thing.Create(coreThing); - // this.rightWheel.transform.SetParent(this.transform); - // } - // WheelCollider wheel = this.GetComponent(); - // if (wheel == null) - // wheel = this.gameObject.AddComponent(); - // wheel.mass = 0.1f; - // wheel.suspensionDistance = 0.01f; - // wheel.suspensionSpring = new JointSpring { - // spring = 1000f, // Very high spring value to make it rigid - // damper = 100f, // Low damping (could be adjusted for slight 'bounciness') - // targetPosition = 0.5f // Neutral position (middle of the suspension travel) - // }; - // wheel.radius = drive.wheelRadius; - // wheel.center = new Vector3(drive.wheelSeparation / 2, 0, 0); - // } + rightWheel.radius = coreDrive.wheelRadius; + rightWheel.center = new Vector3(coreDrive.wheelSeparation / 2, 0, 0); } } diff --git a/Unity/Resources/DifferentialDrive.prefab b/Unity/Resources/DifferentialDrive.prefab new file mode 100644 index 0000000..10a99be --- /dev/null +++ b/Unity/Resources/DifferentialDrive.prefab @@ -0,0 +1,315 @@ +%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} + 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, z: 0} + 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!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} + 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: 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_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_Enabled: 1 + m_ProvidesContacts: 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 + 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} + 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: + 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} +--- !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.5 + 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} + 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: 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_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_Enabled: 1 + m_ProvidesContacts: 0 diff --git a/Unity/Resources/TouchSensor.prefab b/Unity/Resources/TouchSensor.prefab new file mode 100644 index 0000000..6bef559 --- /dev/null +++ b/Unity/Resources/TouchSensor.prefab @@ -0,0 +1,191 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &1535520457298351474 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1122722937167266542} + - component: {fileID: 8409364771467476437} + - component: {fileID: 6632295589629461102} + m_Layer: 0 + m_Name: Sphere + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1122722937167266542 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1535520457298351474} + 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.01, z: 0.01} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 839661735326876684} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &8409364771467476437 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1535520457298351474} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &6632295589629461102 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1535520457298351474} + 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!1 &6521541507066528382 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 839661735326876684} + - component: {fileID: 1922171662874522792} + - component: {fileID: 5295705618145761524} + - component: {fileID: 5884202444353424411} + m_Layer: 0 + m_Name: TouchSensor + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &839661735326876684 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6521541507066528382} + 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: 1122722937167266542} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1922171662874522792 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6521541507066528382} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ab969221c3007d441b18dd7387cf22d4, type: 3} + m_Name: + m_EditorClassIdentifier: + k__BackingField: + terminate: 0 + id: 4 + type: 5 + nameChanged: 1 + hierarchyChanged: 1 + positionUpdated: 0 + orientationUpdated: 0 + linearVelocityUpdated: 0 + angularVelocityUpdated: 0 + participant: {fileID: 0} +--- !u!54 &5295705618145761524 +Rigidbody: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6521541507066528382} + serializedVersion: 4 + m_Mass: 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: 1 + m_Interpolate: 0 + m_Constraints: 0 + m_CollisionDetection: 0 +--- !u!135 &5884202444353424411 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6521541507066528382} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 1 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Radius: 0.01 + m_Center: {x: 0, y: 0, z: 0} diff --git a/Unity/TouchSensor.cs b/Unity/TouchSensor.cs index 8a1fe79..63711f7 100644 --- a/Unity/TouchSensor.cs +++ b/Unity/TouchSensor.cs @@ -36,32 +36,28 @@ namespace RoboidControl.Unity { /// The core touch sensor /// The Unity representation of the touch sensor public static TouchSensor Create(RoboidControl.TouchSensor core) { - GameObject gameObj = new(core.name); - TouchSensor component = gameObj.AddComponent(); - component.Init(core); - - Rigidbody rb = gameObj.AddComponent(); - rb.isKinematic = true; - - SphereCollider collider = gameObj.AddComponent(); - collider.radius = 0.01f; - collider.isTrigger = true; - - if (gameObj.transform.parent != null && gameObj.transform.localPosition.magnitude > 0) { - collider.radius = Vector3.Distance(gameObj.transform.position, gameObj.transform.parent.position) / 2; - gameObj.transform.position = (gameObj.transform.position + gameObj.transform.parent.position) / 2; + GameObject prefab = (GameObject)Resources.Load("TouchSensor"); + if (prefab != null) { + // Use resource prefab when available + GameObject gameObj = Instantiate(prefab); + TouchSensor component = gameObj.GetComponent(); + if (component != null) + component.core = core; + return component; } + else { + // Fallback implementation + GameObject gameObj = new(core.name); + TouchSensor component = gameObj.AddComponent(); + component.Init(core); - return component; - } + Rigidbody rb = gameObj.AddComponent(); + rb.isKinematic = true; - protected override void Update() { - base.Update(); - if (touchCollider.radius == 0.01f && - this.transform.parent != null && this.transform.localPosition.magnitude > 0 - ) { - touchCollider.radius = Vector3.Distance(this.transform.position, this.transform.parent.position) / 2; - this.transform.position = (this.transform.position + this.transform.parent.position) / 2; + SphereCollider collider = gameObj.AddComponent(); + collider.radius = 0.01f; + collider.isTrigger = true; + return component; } }