94 lines
2.7 KiB
C#
94 lines
2.7 KiB
C#
#if UNITY_5_3_OR_NEWER
|
|
using Unity.VisualScripting;
|
|
using UnityEngine;
|
|
|
|
namespace RoboidControl.Unity {
|
|
|
|
/// <summary>
|
|
/// The Unity representation of the TouchSensor
|
|
/// </summary>
|
|
public class TouchSensor : Thing {
|
|
|
|
public SiteServer participant;
|
|
/// <summary>
|
|
/// The core touch sensor
|
|
/// </summary>
|
|
public RoboidControl.TouchSensor coreSensor {
|
|
get => (RoboidControl.TouchSensor)base.core;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Start the Unity represention
|
|
/// </summary>
|
|
protected virtual void Start() {
|
|
if (core == null) {
|
|
participant = FindAnyObjectByType<SiteServer>();
|
|
SetCoreThing(new RoboidControl.TouchSensor(participant.site));
|
|
}
|
|
// Somehow this does not work.
|
|
|
|
// Rigidbody rb = GetComponentInParent<Rigidbody>();
|
|
// if (rb == null) {
|
|
// RoboidControl.Thing thing = core;
|
|
// while (thing.parent != null)
|
|
// thing = thing.parent;
|
|
|
|
// Thing unityThing = thing.component;
|
|
// rb = unityThing.gameObject.AddComponent<Rigidbody>();
|
|
// rb.isKinematic = true;
|
|
// }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Create the Unity representation
|
|
/// </summary>
|
|
/// <param name="core">The core touch sensor</param>
|
|
/// <returns>The Unity representation of the touch sensor</returns>
|
|
public static TouchSensor Create(RoboidControl.TouchSensor core) {
|
|
GameObject gameObj = core.name != null ?
|
|
new(core.name) :
|
|
new("Touch Sensor");
|
|
TouchSensor component = gameObj.AddComponent<TouchSensor>();
|
|
Rigidbody rb = gameObj.AddComponent<Rigidbody>();
|
|
rb.isKinematic = true;
|
|
|
|
SphereCollider collider = gameObj.AddComponent<SphereCollider>();
|
|
collider.radius = 0.01f;
|
|
collider.isTrigger = true;
|
|
|
|
component.core = core;
|
|
component.participant = FindAnyObjectByType<SiteServer>();
|
|
core.thisParticipant = component.participant.site;
|
|
|
|
if (core.parent != null && core.parent.component != null) {
|
|
gameObj.transform.SetParent(core.parent.component.transform, false);
|
|
}
|
|
|
|
if (core.position != null)
|
|
gameObj.transform.localPosition = core.position.ToVector3();
|
|
|
|
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;
|
|
}
|
|
|
|
return component;
|
|
}
|
|
|
|
private void OnTriggerEnter(Collider other) {
|
|
if (other.isTrigger)
|
|
return;
|
|
if (this.transform.root == other.transform.root)
|
|
return;
|
|
|
|
this.coreSensor.touchedSomething = true;
|
|
}
|
|
private void OnTriggerExit(Collider other) {
|
|
if (other.isTrigger)
|
|
return;
|
|
|
|
this.coreSensor.touchedSomething = false;
|
|
}
|
|
}
|
|
}
|
|
#endif |