Spelunx Cavern SDK
 
Loading...
Searching...
No Matches
MirroringState.cs
Go to the documentation of this file.
1using UnityEngine;
2
3[CreateAssetMenu(fileName = "Mirroring", menuName = "FiniteStateMachine/Creature/Mirroring")]
4public class MirroringState : State
5{
6 [SerializeField, Tooltip("Zone where mirroring won't happen to prevent rapid changing")] private float deadZoneRadius = 0.5f;
7 [SerializeField, Tooltip("time (seconds) to stay near big creature")] private float timeToStay = 4.0f;
8 [SerializeField, Tooltip("hugging countdown VFX prefab")] private GameObject countdownVFXPrefab;
9
10 private float timer;
11 private CreatureBehavior creature;
12 private GameObject countdownVFXObj;
13 public override string GetName() { return "Mirroring"; }
14
15 public override void OnEnter(FiniteStateMachine fsm, GameObject target)
16 {
17 Debug.Log("-----Enter Mirroring state-----");
18 creature = target.GetComponent<CreatureBehavior>();
19 creature.PlayMirroring();
20 timer = 0f;
21 }
22
23 public override void OnUpdate(FiniteStateMachine fsm, GameObject target)
24 {
25 UpdateLocation(creature);
26
27 // check if stayed by river area more than timeToStay seconds, if yes, changeState(HuggingState)
28 if (creature.NearBigCreature())
29 {
30 timer += Time.deltaTime;
31
32 // play particles
33 if (countdownVFXObj == null)
34 {
35 countdownVFXObj = Instantiate(countdownVFXPrefab);
36 }
37
38 Debug.Log($"near big creature with {timer}s");
39 if (timer >= timeToStay)
40 {
41 creature.PlayCorrect();
42 Destroy(countdownVFXObj);
43 fsm.ChangeState("Hugging");
44 }
45 }
46 else
47 {
48 timer = 0f;
49 // stop particles
50 Destroy(countdownVFXObj);
51 }
52 }
53
54 private void UpdateLocation(CreatureBehavior creature)
55 {
56 Spelunx.CavernRenderer cavernSetup = creature.GetCavernSetup();
57 Transform playerTracker = creature.GetViveTrackerObject().transform;
58
59 Vector3 center = cavernSetup.transform.position;
60 Vector3 cavernFlatPos = new Vector3(center.x, 0, center.z);
61 Vector3 newDirection = (new Vector3(playerTracker.position.x, 0, playerTracker.position.z) - cavernFlatPos).normalized;
62 float newRadius = (2 * cavernSetup.GetCavernRadius() - (Vector3.Distance(new Vector3(playerTracker.position.x, 0, playerTracker.position.z), cavernFlatPos)));
63
64 if (newRadius > deadZoneRadius)
65 {
66 Vector3 newVector = newDirection * newRadius;
67 Vector3 mirroredPosition = center + new Vector3(newVector.x, playerTracker.position.y, newVector.z);
68 creature.transform.position = mirroredPosition;
69 }
70 // mirroring rotation
71 Vector3 mirrorNormal = (creature.transform.position - center).normalized; // Normal of the mirror plane
72 Vector3 reflectedForward = Vector3.Reflect(playerTracker.forward, mirrorNormal);
73 creature.transform.rotation = Quaternion.LookRotation(reflectedForward, Vector3.up);
74 }
75}
Spelunx.CavernRenderer GetCavernSetup()
GameObject GetViveTrackerObject()
void ChangeState(string nextState)
override void OnEnter(FiniteStateMachine fsm, GameObject target)
override string GetName()
override void OnUpdate(FiniteStateMachine fsm, GameObject target)