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;
}
}