HumanoidControl_Free/Runtime/HumanoidFree/Scripts/Tools/HumanoidInteractionPointer.cs
Pascal Serrarens 17741d862a First commit
2022-01-12 10:50:57 +01:00

207 lines
8.6 KiB
C#

using UnityEngine;
namespace Passer.Humanoid {
/*
/// <summary>An Inetraction Pointer for Humanoids</summary>
public class HumanoidInteractionPointer : InteractionPointer {
/// <summary>The InteractionModule used for interacting with Unity UI elements</summary>
protected InteractionModule interactionModule;
/// <sumaary>The ID of the interaction used for interaction with Unity UI elemnts</sumaary>
protected int interactionID;
/// <summary>Adds a default InteractionPointer to the transform</summary>
/// <param name="parentTransform">The transform to which the Teleporter will be added</param>
/// <param name="pointerType">The interaction pointer type for the Teleporter.</param>
public static new InteractionPointer Add(Transform parentTransform, PointerType pointerType = PointerType.Ray) {
GameObject pointerObj = new GameObject("Interaction Pointer");
pointerObj.transform.SetParent(parentTransform);
pointerObj.transform.localPosition = Vector3.zero;
pointerObj.transform.localRotation = Quaternion.identity;
GameObject focusPointObj = new GameObject("FocusPoint");
focusPointObj.transform.SetParent(pointerObj.transform);
focusPointObj.transform.localPosition = Vector3.zero;
focusPointObj.transform.localRotation = Quaternion.identity;
if (pointerType == PointerType.FocusPoint) {
GameObject focusPointSphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
focusPointSphere.transform.SetParent(focusPointObj.transform);
focusPointSphere.transform.localPosition = Vector3.zero;
focusPointSphere.transform.localRotation = Quaternion.identity;
focusPointSphere.transform.localScale = Vector3.one * 0.1F;
Collider collider = focusPointSphere.GetComponent<Collider>();
DestroyImmediate(collider, true);
}
else {
LineRenderer pointerRay = focusPointObj.AddComponent<LineRenderer>();
pointerRay.startWidth = 0.01F;
pointerRay.endWidth = 0.01F;
pointerRay.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
pointerRay.receiveShadows = false;
pointerRay.useWorldSpace = false;
}
InteractionPointer pointer = pointerObj.AddComponent<HumanoidInteractionPointer>();
pointer.focusPointObj = focusPointObj;
pointer.rayType = RayType.Straight;
return pointer;
}
private HeadTarget headTarget;
protected override void Awake() {
HumanoidControl humanoid = this.transform.root.GetComponentInChildren<HumanoidControl>();
if (humanoid == null)
base.Awake();
else {
//inputModule = humanoid.GetComponent<Interaction>();
interactionModule = FindObjectOfType<InteractionModule>();
if (interactionModule == null) {
interactionModule = humanoid.gameObject.AddComponent<InteractionModule>();
}
interactionID = interactionModule.CreateNewInteraction(transform, timedClick);
if (focusPointObj == null) {
focusPointObj = new GameObject("Focus Point");
focusPointObj.transform.parent = transform;
}
lineRenderer = focusPointObj.GetComponent<LineRenderer>();
if (lineRenderer != null) {
lineRenderer.useWorldSpace = false;
lineRenderer.SetPosition(1, Vector3.zero);
}
headTarget = transform.parent.GetComponent<HeadTarget>();
}
}
#region Update
protected override void Update() {
if (focusPointObj == null)
return;
interactionModule.ActivatePointing(interactionID, active);
if (interactionModule.IsPointing(interactionID)) {
focusPointObj.SetActive(true);
if (rayType == RayType.SphereCast) {
UpdateSpherecast();
}
else if (lineRenderer != null) {
lineRenderer.enabled = true;
switch (rayType) {
case RayType.Straight:
UpdateStraight();
break;
case RayType.Bezier:
UpdateBezier();
break;
case RayType.Gravity:
UpdateGravity();
break;
}
}
else {
Vector3 focusPoint = interactionModule.GetFocusPoint(interactionID);
Vector3 localFocusPoint = transform.InverseTransformPoint(focusPoint);
focusPointObj.transform.position = transform.TransformPoint(localFocusPoint - Vector3.forward * 0.01F);
focusPointObj.transform.rotation = interactionModule.GetFocusRotation(interactionID);
}
objectInFocus = interactionModule.GetFocusObject(interactionID);
if (objectInFocus != null) {
Rigidbody rigidbodyInFocus = objectInFocus.GetComponentInParent<Rigidbody>();
if (rigidbodyInFocus != null)
objectInFocus = rigidbodyInFocus.gameObject;
}
if (timedClick != 0) {
if (!hasClicked && interactionModule.IsTimedClick(interactionID)) {
Click(true);
hasClicked = true;
Click(false);
}
}
}
else {
focusPointObj.SetActive(false);
focusPointObj.transform.position = transform.position;
objectInFocus = null;
hasClicked = false;
}
UpdateFocus();
UpdateFocusPoint();
if (headTarget != null) {
#if hFACE
transform.rotation = Quaternion.LookRotation(headTarget.face.gazeDirection);
#endif
}
}
protected override void UpdateStraight() {
Vector3 focusPosition = transform.position + transform.forward * 10;
Quaternion focusRotation = Quaternion.LookRotation(-transform.forward);
GameObject focusObject = null;
RaycastHit hit;
bool raycastHit = Physics.Raycast(transform.position, transform.forward, out hit, maxDistance);
if (raycastHit) {
focusPosition = hit.point;
focusRotation = Quaternion.LookRotation(hit.normal);
focusObject = hit.transform.gameObject;
}
interactionModule.SetExternalRayCast(interactionID, focusPosition, focusRotation, focusObject);
focusPointObj.transform.position = focusPosition;
focusPointObj.transform.rotation = focusRotation;
Vector3 endPosition = focusPointObj.transform.InverseTransformPoint(transform.position);
lineRenderer.positionCount = 2;
lineRenderer.SetPosition(0, endPosition);
}
#endregion
/// <summary>Sets the diration in which the pointer points</summary>
/// While writing this, I wonder why the rotation of the transform is not used here.
public void SetRayDirection(Vector3 direction) {
interactionModule.SetPointingDirection(interactionID, direction);
}
public override void Activation(bool _active) {
base.Activation(_active);
}
/// <summary>Automatically clicks when it is deactivated</summary>
/// This function will activate the interaction pointer when the active parameter is true
/// and will perform a click when the interaction pointer is deactivated again.
/// This enables you to do interaction with one button.
/// <param name="_active">The new activation status of the interaction pointer</param>
public void ActivationClick(bool _active) {
if (active && !_active) {
base.Click(true);
base.Activation(false);
base.Click(false);
}
else if (!active && _active) {
base.Activation(true);
}
}
public override void Click(bool clicking) {
base.Click(clicking);
}
}
*/
}