Spelunx Cavern SDK
 
Loading...
Searching...
No Matches
OrbitCavernInteraction.cs
Go to the documentation of this file.
1using UnityEngine;
2
3namespace Spelunx.Vive {
4 /*
5 * This script assumes the CAVERN screen is a mirror, and the object holding this script will be mirrored.
6 * A deadzone radius value can be assigned to prevent area near the center reflecting endlessly and spinning around.
7 */
9 public enum OrbitMode {
10 Default = 0,
13 }
14
15 [SerializeField] private float deadZoneRadius = 0.5f;
16 [SerializeField] private bool lookAtCentre = true;
17 [SerializeField] private OrbitMode orbitMode = OrbitMode.Default;
18
19 public void SetDeadZoneRadius(float deadZoneRadius) { this.deadZoneRadius = deadZoneRadius; }
20 public float GetDeadZoneRadius() { return deadZoneRadius; }
21
22 public bool GetLookAtCentre() { return lookAtCentre; }
23 public void SetLookAtCentre(bool lookAtCentre) { this.lookAtCentre = lookAtCentre; }
24
25 public OrbitMode GetOrbitMode() { return orbitMode; }
26 public void SetOrbitMode(OrbitMode orbitMode) { this.orbitMode = orbitMode; }
27
28 private void Update() {
29 if (target == null || cavernRenderer == null) return;
30
31 // Set position.
32 Vector3 targetPosition = new Vector3(target.position.x, 0.0f, target.position.z);
33 Vector3 cavernPosition = new Vector3(cavernRenderer.transform.position.x, 0.0f, cavernRenderer.transform.position.z);
34 Vector3 cavernToTarget = targetPosition - cavernPosition;
35 if (cavernToTarget.magnitude < deadZoneRadius) return;
36 float screenRadius = cavernRenderer.GetCavernRadius();
37
38 switch (orbitMode) {
39 case OrbitMode.MirrorDistance:
40 transform.position = cavernPosition +
41 new Vector3(0.0f, target.position.y, 0.0f) +
42 cavernToTarget.normalized * (2.0f * screenRadius - cavernToTarget.magnitude);
43 break;
44 case OrbitMode.FixedDistance:
45 Vector3 thisPosition = new Vector3(transform.position.x, 0.0f, transform.position.z);
46 transform.position = cavernPosition +
47 new Vector3(0.0f, target.position.y, 0.0f) +
48 cavernToTarget.normalized * (thisPosition - cavernPosition).magnitude;
49 break;
50 default:
51 transform.position = cavernPosition +
52 new Vector3(0.0f, target.position.y, 0.0f) +
53 cavernToTarget.normalized * (screenRadius + cavernToTarget.magnitude);
54 break;
55 }
56
57 // Set Rotation.
58 if (lookAtCentre) {
59 transform.LookAt(new Vector3(cavernRenderer.transform.position.x, target.position.y, cavernRenderer.transform.position.z));
60 }
61 }
62 }
63}
void SetDeadZoneRadius(float deadZoneRadius)